package com.nxy.cpfsfe;

import com.adtec.starring.data.ibatis.IBaseDos;
import com.adtec.starring.data.route.IDataSourceRoute;
import com.adtec.starring.datapool.CompSDO;
import com.adtec.starring.datapool.DataPool;
import com.adtec.starring.datapool.DataPoolManager;
import com.adtec.starring.datapool.EPOper;
import com.adtec.starring.exception.BaseException;
import com.adtec.starring.log.TrcLog;
import com.adtec.starring.pubmethod.Message;
import com.adtec.starring.respool.PoolOperate;
import com.adtec.starring.respool.StarringSeq;
import com.adtec.starring.struct.dta.DtaInfo;
import com.adtec.starring.struct.svcdepend.SvcDepend;
import com.adtec.starring.tool.DTATool;
import com.adtec.starring.util.SpringUtil;
import com.adtec.starring.util.StringTool;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.nxy.cpfsfe.config.CpfsFeAllConfig;
import net.sf.json.JSONObject;
import org.springframework.util.StringUtils;
import org.w3c.dom.Document;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Matcher;
import java.util.regex.Pattern;



public class PubBean {
	public static final String CENT_O_ECD = "0000";// 中心合作机构代码

	/**
	 * 打印数据池
	 */
	public static void printDataPool() {
		String data = EPOper.epToJSON(DtaInfo.getInstance().getTpId(), "utf-8");
		TrcLog.log("DataPool.log", data);
	}
 
	/**
	 * 封装异常码
	 * 
	 * @param errorCode
	 */
	public void encapExpection(String errorCode, Object... errorDesc) {
		new BaseException(errorCode, errorDesc);
	}

	/***
	 * 
	 * 分页结束标志
	 * 
	 * 
	 */
	public String getEndFlag(String total, String start, String evPg) {

		int totalInt = (Integer) EPOper.get(DtaInfo.getInstance().getTpId(), total);// 本次查询条数
		int startInt = (Integer) EPOper.get(DtaInfo.getInstance().getTpId(), start);// 起始位置数
		int evPgInt = (Integer) EPOper.get(DtaInfo.getInstance().getTpId(), evPg);// 每页显示数量

		if (startInt + evPgInt >= totalInt) {
			return "Y";
		}
		return "N";
	}

	public String getAcctFromList() {
		TrcLog.log("111111.log", "dataMap start");
		DtaInfo dtaInfo = DtaInfo.getInstance();
		// int num = (Integer) EPOper.get(dtaInfo.getCpId(), "ListNum[0].Num");
		int num = (Integer) EPOper.get(dtaInfo.getTpId(), "ListNum[0].Num[0]");
		TrcLog.log("111111.log", "num:" + num);
		String custAcctno = (String) EPOper.get(dtaInfo.getCpId(),
				"bsInfSgngQrySgngAcctList_output[0].acctnoList[" + num + "].custAcctno[0]");
		TrcLog.log("111111.log", "cur- " + num + " -" + " - " + custAcctno);

		// CompSDO sdo = EPOper.getCompSDO(dtaInfo.getTpId(), "");

		return custAcctno;
		// EPOper.put(dtaInfo.getTpId(),"",custAcctno);

	}

	/**
	 * 生成rcdId，用于内联授权信息id 节点号3+日期时间8+流水号5
	 */
	public String sys_reqSeq_16() {
		/* 取序号发生器生成的值 */
		int seq = StarringSeq.getCustomSeq("3");
		String seqNo = String.format("%05d", seq);// 3位流水号
		DtaInfo dtaInfo = DtaInfo.getInstance();
		String nodeName = dtaInfo.getNodeName(); // 取机器节点号
		int nodeNo = Integer.parseInt(nodeName); // 转化为整型的节点号
		String seqName = String.format("%03d", nodeNo);// 3位节点名
		String rcdId = seqName + getNowDate() + seqNo;
		TrcLog.info("11111.log", rcdId);
		return rcdId;
		// put("PUB_ELEMENT[0].BkSeqNo", seqName+getNowDate() + seqNo);
	}

	/**
	 * 贷款申请编号，4位省联社编号+14位时间戳+6位机器号。
	 */
	public String getSeq() {
		/* 取序号发生器生成的值 */
		int seq = StarringSeq.getCustomSeq("4");
		String seqNo = String.format("%05d", seq);// 3位流水号
		DtaInfo dtaInfo = DtaInfo.getInstance();
		Object servInitrBrch = EPOper.get(dtaInfo.getTpId(), "ReqBean[0].head[0].servInitrBrch");
		String instEcd = "";
		try {
			instEcd = servInitrBrch.toString();
		} catch (Exception e) {
			// TODO: handle exception
			instEcd = "0000";
		}
		String nodeName = dtaInfo.getNodeName(); // 取机器节点号
		int nodeNo = Integer.parseInt(nodeName); // 转化为整型的节点号
		String seqName = String.format("%03d", nodeNo);// 3位节点名
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
		String str = sdf.format(date);
		String loanId = new StringBuffer(instEcd).append(seqName).append(str).append(seqNo).toString();
		TrcLog.info("11111.log", loanId);
		return loanId;
		// put("PUB_ELEMENT[0].BkSeqNo", seqName+getNowDate() + seqNo);
	}

	/**
	 * 获取机器日期
	 * 
	 * @return
	 */
	public static String getNowDate() {
		Date date = new Date();// 创建一个时间对象，获取到当前的时间
		// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd
		// HH:mm:ss");//设置时间显示格式
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		String str = sdf.format(date);// 将当前时间格式化为需要的类型
		// System.out.println(str);//输出结果
		return str;
	}

	/**
	 * 获取6位长时分秒时间
	 * 
	 * @return
	 */
	public static String getNowTime() {
		Date date = new Date();
		DateFormat df = new SimpleDateFormat("HHmmss");
		String dbTm = df.format(date);
		return dbTm;
	}

	/**
	 * 获取传入日期的下一日（字符串）
	 * 
	 * @param thisDtStr
	 *            传入的日期字符串
	 * @return
	 */
	public static String getNextDate(String thisDtStr) {
		return getNextNDate(thisDtStr, 1);
	}

	/**
	 * 获取传入日期的下一日（字符串）
	 * 
	 * @param thisDtStr
	 *            传入的日期字符串
	 * @return
	 */
	public static String getNextNDate(String thisDtStr, int n) {
		if (StringTool.isNullOrEmpty(thisDtStr)) {
			return null;
		}
		DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		try {
			Date thisDt = sdf.parse(thisDtStr);
			Calendar cal = Calendar.getInstance();
			cal.setTime(thisDt);
			cal.add(Calendar.DAY_OF_MONTH, n);// 日期加1n
			return sdf.format(cal.getTime());
		} catch (ParseException e) {
			TrcLog.log("err.log", "日期[" + thisDtStr + "]转换失败:" + e.getMessage());
			return null;
		}
	}

	/**
	 * 将发起方时间戳的格式转换为核心格式yyyyMMddhhmmss;
	 * 
	 * @return
	 */
	public static String getCrTmFrmInitrTmStmp() {
		DtaInfo dtaInfo = DtaInfo.getInstance();
		String strDt = (String) EPOper.get(dtaInfo.getTpId(), "ReqBean[0].head[0].initrTmStmp");
		DateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		DateFormat sdf2 = new SimpleDateFormat("yyyyMMddhhmmss");
		Date dt;
		try {
			dt = sdf1.parse(strDt);
			strDt = sdf2.format(dt);
		} catch (ParseException e) {
			e.printStackTrace();
		}

		return strDt;
	}

	/**
	 * 获取10位长日期时间
	 * 
	 * @return
	 */
	public static String getDbDt() {
		Date date = new Date();
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		String dbDt = df.format(date);
		return dbDt;
	}

	/**
	 * 获取当前时间加十年的时间
	 */
	public static String addTenYears() {
		SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.YEAR, 10);
		return df.format(cal.getTime());
	}

	/**
	 * 获取8位长时分秒时间
	 * 
	 * @return
	 */
	public static String getDbTm() {
		Date date = new Date();
		DateFormat df = new SimpleDateFormat("HH:mm:ss");
		String dbTm = df.format(date);
		return dbTm;
	}

	/**
	 * 获取最后更新时间
	 * 
	 * @return
	 */
	public static String getFinlUpdTm() {
		Date date = new Date();
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String finlUpdTm = df.format(date);
		return finlUpdTm;
	}

	/**
	 * 获取最后更新时间
	 * 
	 * @return
	 */
	public static String getCreTm() {
		Date date = new Date();
		DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
		String finlUpdTm = df.format(date);
		return finlUpdTm;
	}

	/**
	 * 获取时间戳到毫秒
	 * 
	 * @return
	 */
	public static String getCreTmSSS() {
		Date date = new Date();
		DateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		String finlUpdTm = df.format(date);
		return finlUpdTm;
	}

	/**
	 * 获取之前时间
	 * 
	 * @return
	 */
	public static String getBeforeDbDt(int num) {
		Calendar cal = Calendar.getInstance();
		cal.add(Calendar.DAY_OF_MONTH, num);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		String begDt2 = sdf.format(cal.getTime());
		return begDt2;
	}
	
	
	/**
	 * 账号类型代码数据映射
	 * 
	 * @param acctnoType
	 * @return
	 */
	public static String acctnoTypMapping(String acctnoType) {
		switch (acctnoType) {
		case "01":
			return "0";
		case "02":
			return "1";
		case "03":
			return "0";
		default:
			throw new BaseException("PC06002");
		}
	}

	/**
	 * 渠道代码数据映射
	 * 
	 * @param chanlCd
	 * @return
	 */
	public String chanlCdMapping(String chanlCd) {
		switch (chanlCd) {
		case "wechat":
			return "13";
		default:
			throw new BaseException("PC99001");
		}
	}

	/**
	 * 从产品平台到TSP的渠道代码数据映射 TSP对渠道代码的说明：01-APP、02-农信通、99-其他
	 * 产品平台对渠道代码的说明：wechat/app/indvweb/entweb/inmgmt 微信/手机/个人网银/企业网银/后管
	 */
	public String chanlCdMappingToTSP(String chanlCd) {
		String chanlCode = (String) EPOper.get(DtaInfo.getInstance().getTpId(), chanlCd);
		// @PubBean.chanlCdMappingToTSP("Reqbean.head.servInitrChanl");
		switch (chanlCode) {
		case "app":
			return "01";
		case "03":// 为了测试
			return "03";
		case "web":
			return "99";
		case "indvweb":
			return "99";
		case "entweb":
			return "99";
		case "inmgmt":
			return "99";
		default:
			throw new BaseException("PC02002");// 渠道代码不在范围之内
		}
	}

	/**
	 * 判断是否异常
	 * 
	 * @return
	 */
	public static boolean isError() {
		String rspsCd = (String) EPOper.get(DtaInfo.getInstance().getTpId(), "RspBean[0].head[0].rspsCd");
		if (StringTool.isNullOrEmpty(rspsCd)) {
			return false;
		} else if (!rspsCd.equals("0000000")) {// 平台返回错误
			return true;
		}
		return false;
	}

	/**
	 * 判断是否为空
	 * 
	 * @return
	 */
	public boolean isNull(String name) {
		String value = (String) EPOper.get(DtaInfo.getInstance().getTpId(), name);
		if (value == null || value == "") {
			return true;
		}
		return false;
	}
	/*
	 * 判断传入为空
	 */
	public boolean isStringNull(String name) {
		if (name == null || name == "") {
			return true;
		}
		return false;
	}

	/**
	 * 判断对象是否为空
	 */
	public boolean isObjectNull(String name) {
		// TrcLog.log("0225.log", "name:" + name);

		String obj = (String) EPOper.get(DtaInfo.getInstance().getTpId(), name);
		if (StringTool.isNullOrEmpty(obj)) {
			TrcLog.log("0225.log", "obj:" + obj);
			return true;
		}
		return false;
	}

	/**
	 * Integer判断是否为空
	 * 
	 * @param name
	 * @return
	 */
	public boolean intIsNull(String name) {
		Integer value = (Integer) EPOper.get(DtaInfo.getInstance().getTpId(), name);
		if (value == null) {
			return false;
		}
		return true;
	}

	/**
	 * 获取异常码
	 * 
	 * @return
	 */
	public static void getErrMsg() {
		String errRet = "";
		String errMsg = "";
		try {
			// Object errRetObj = EPOper.get(DtaInfo.getInstance().getTpId(),
			// "__PLAT_FLOW.__ERR_CODE");
			// Object errMsgObj = EPOper.get(DtaInfo.getInstance().getTpId(),
			// "__PLAT_FLOW.__ERR_MSG");
			//
			// if (errRetObj != null && errMsgObj != null) {
			// errRet = (String) errRetObj;
			// errMsg = (String) errMsgObj;
			// if (errRet.startsWith("1")) {
			// errRet = "35021";
			// errMsg = "系统异常！";
			// } else if (errRet.equals("35021")) {
			// errMsg = "系统异常！";
			// }
			// }

			errRet = (String) EPOper.get(DtaInfo.getInstance().getTpId(), "RspBean[0].head[0].rspsCd");
			if (StringTool.isNullOrEmpty(errRet)) {
				errRet = "0000000";
			}
			errMsg = (String) EPOper.get(DtaInfo.getInstance().getTpId(), "RspBean[0].head[0].respsInfoDesc");
			if (StringTool.isNullOrEmpty(errMsg)) {
				errMsg = "成功";
			}
		} catch (Exception e) {
			errRet = "PCA3004";
			errMsg = "系统异常";
		} finally {
			EPOper.put(DtaInfo.getInstance().getTpId(), "RspBean[0].head[0].rspsCd", errRet);
			EPOper.put(DtaInfo.getInstance().getTpId(), "RspBean[0].head[0].respsInfoDesc", errMsg);
		}
	}

	/**
	 * 获取异常码
	 * 
	 * @return
	 */
	public static void getInterErrMsg() {
		String errRet = "";
		String errMsg = "";
		try {
			// Object errRetObj = EPOper.get(DtaInfo.getInstance().getTpId(),
			// "__PLAT_FLOW.__ERR_CODE");
			// Object errMsgObj = EPOper.get(DtaInfo.getInstance().getTpId(),
			// "__PLAT_FLOW.__ERR_MSG");
			//
			// if (errRetObj != null && errMsgObj != null) {
			// errRet = (String) errRetObj;
			// errMsg = (String) errMsgObj;
			// if (errRet.startsWith("1")) {
			// errRet = "35021";
			// errMsg = "系统异常！";
			// } else if (errRet.equals("35021")) {
			// errMsg = "系统异常！";
			// }
			// }
			errRet = (String) EPOper.get(DtaInfo.getInstance().getTpId(), "__GDTA_FORMAT.__ERR_RET");
			TrcLog.log("err.log", "errRet:" + errRet);
			if (StringTool.isNullOrEmpty(errRet)) {
				errRet = "0000000";
			}
			errMsg = (String) EPOper.get(DtaInfo.getInstance().getTpId(), "__GDTA_FORMAT.__ERR_MSG");
			if (StringTool.isNullOrEmpty(errMsg)) {
				errMsg = "成功";
			}

			if (errRet.startsWith("1")) {
				if (errRet.equals("15023")) {
					errRet = "PC99002";
					// errMsg = "数据字段不能为空";
				}
				else if (errRet.equals("10120")) {
					errRet = "PC99006";
					if(errMsg.equals("成功"))
						errMsg = "数据字段超长";
				}
				else if (errRet.equals("15025")){
					errRet = "PC99007";
				}
				else {
					errRet = "PCA3004";
					errMsg = "系统异常";
				}
			}
		} catch (Exception e) {
			errRet = "PCA3004";
			errMsg = "系统异常";
		} finally {
			TrcLog.log("err.log", "finally errRet:" + errRet);
			EPOper.put(DtaInfo.getInstance().getTpId(), "RspBean[0].head[0].rspsCd", errRet);
			EPOper.put(DtaInfo.getInstance().getTpId(), "RspBean[0].head[0].respsInfoDesc", errMsg);

		}
	}

	/**
	 * 获取服务编码和发起方流水号
	 */
	public static void getServEcdAndInitrSeqno() {
		Object svcNameObj = EPOper.get(DtaInfo.getInstance().getTpId(), "__GDTA_FORMAT.__GDTA_SVCNAME");
		if (svcNameObj != null) {
			String svcName = (String) svcNameObj;
			if (!StringTool.isNullOrEmpty(svcName)) {
				EPOper.put(DtaInfo.getInstance().getTpId(), "RspBean[0].head[0].servEcd", svcName);
			}
		}
		Object initrSeqnoObj = EPOper.get(DtaInfo.getInstance().getTpId(), "ReqBean[0].head[0].initrSeqno");
		if (initrSeqnoObj != null) {
			String initrSeqno = (String) initrSeqnoObj;
			if (!StringTool.isNullOrEmpty(initrSeqno)) {
				EPOper.put(DtaInfo.getInstance().getTpId(), "RspBean[0].head[0].initrSeqno", initrSeqno);
			}
		}
	}

	/**
	 * 日志监控关联业务流水号
	 * 
	 * @author Douxy
	 */
	public static void corlBussSeqnoForLog() {
		Object initrSeqnoObj = EPOper.get(DtaInfo.getInstance().getTpId(), "ReqBean[0].head[0].initrSeqno");
		if (initrSeqnoObj != null) {
			String initrSeqno = (String) initrSeqnoObj;
			if (!StringTool.isNullOrEmpty(initrSeqno)) {
				// DtaInfo.getInstance().getDrqInfo().setBusSeqNo(initrSeqno);
				DtaInfo.getInstance().setReqSeq(initrSeqno);
				DtaInfo.getInstance().getDrqInfo().setBusSeqNo(initrSeqno);
			}
		}
	}

	// 本地平台流水号作为下一个节点的请求方平台流水号
	public static void corlOrgnInitrSeqno() {
		String seqNo = com.adtec.starring.struct.dta.DtaInfo.getInstance().getSeqNo();
		EPOper.put(DtaInfo.getInstance().getTpId(), "ReqBean[0].head[0].orgnInitrSeqno", seqNo);
	}

	/**
	 * 获取某对象个数
	 * 
	 * @param element
	 * @return
	 */
	public static int getIndexOfDataElement(String element) {
		int size = 0;
		int i = element.indexOf(".");
		DataPool dp = DataPoolManager.getEpById(DtaInfo.getInstance().getTpId());
		ConcurrentHashMap<String, ArrayList<CompSDO>> poolMap = (ConcurrentHashMap<String, ArrayList<CompSDO>>) dp
				.getElementTable();
		if (i == -1) {
			if (element.indexOf("[") == -1 && element.indexOf("]") == -1) {
				size = poolMap.get(element) == null ? 0 : poolMap.get(element).size();
			} else if ((element.indexOf("[") == -1 && element.indexOf("]") != -1)
					|| (element.indexOf("[") != -1 && element.indexOf("]") == -1)) {
				throw new BaseException("参数不合法 ");
			}

		} else {
			CompSDO compSDO;
			String[] parts = element.split("\\.");
			if (parts[1].indexOf("[") == -1 && parts[0].indexOf("]") == -1) {
				compSDO = poolMap.get(parts[0]).get(0);
			} else {
				int beginIndex = parts[0].indexOf("[");
				int endIndex = parts[0].indexOf("]");
				String index = parts[0].substring(beginIndex + 1, endIndex);
				compSDO = poolMap.get(element.substring(0, beginIndex)).get(Integer.parseInt(index));
			}
			String elements = element.substring(element.indexOf(".") + 1);
			size = getList(compSDO, elements);
		}
		return size;
	}

	public static int getList(CompSDO compSDO, String elements) {
		int result = 0;
		String element = null;
		if (elements.indexOf(".") == -1) {
			element = elements;
		} else {
			element = elements.substring(0, elements.indexOf("."));
		}
		int beginIndex = element.indexOf("[");
		int endIndex = element.indexOf("]");
		Object obj;
		boolean flag = elements.split("\\.").length > 1 ? true : false;
		if (beginIndex != -1 && endIndex != -1) {
			String num = element.substring(beginIndex + 1, endIndex);
			element = element.substring(0, beginIndex);
			if (flag) {
				obj = compSDO.get(element).get(Integer.parseInt(num));
				result = getList((CompSDO) obj, elements.substring(elements.indexOf(".") + 1));
			} else {
				result = compSDO.get(element).get().size();
			}

		} else {
			if (flag) {
				obj = compSDO.get(element).get(0);
				result = getList((CompSDO) obj, elements.substring(elements.indexOf(".") + 1));
			} else {
				result = compSDO.get(element).get().size();
			}
		}

		return result;
	}

	/**
	 * 根据参数进行数据库路由规则计算
	 * 
	 * @return
	 */
	public int routeDB(String str, int num) {
		int id = Math.abs(str.hashCode());// 取hash的绝对值
		id = id % num;// 根据数据库数量，取模
		return id;
	}

	public void sleep60() {
		try {
			Thread.sleep(60000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}

	/**
	 * 将平台对象转为esb对象并将数据对象转为xml字符串
	 * 
	 * @return
	 */
	public void toXml(int opTypCd) {
		DtaInfo dtaInfo = DtaInfo.getInstance();
		CompSDO sdo = null;
		// 判断查询操作类型代码
		if (opTypCd == 1) {
			// 为1时按笔数查询调用CBS2000020
			// 账号
			String qryA = (String) EPOper.get(dtaInfo.getTpId(), "c03QryTDtl_input.qryA");
			EPOper.put(dtaInfo.getTpId(), "CBS2000020[0].accountNo[0]", qryA);
			// 交易笔数
			Integer tDN = (Integer) EPOper.get(dtaInfo.getTpId(), "c03QryTDtl_input.tDN");
			EPOper.put(dtaInfo.getTpId(), "CBS2000020[0].totalQnt[0]", tDN);

			sdo = EPOper.getCompSDO(dtaInfo.getTpId(), "CBS2000020");
		} else if (opTypCd == 2) {
			// 为2时按时间查询调用CBS0000060
			// 账号
			String qryA = (String) EPOper.get(dtaInfo.getTpId(), "c03QryTDtl_input.qryA");
			EPOper.put(dtaInfo.getTpId(), "CBS0000060[0].acct[0]", qryA);
			// 款项代码
			String mnyCd = (String) EPOper.get(dtaInfo.getTpId(), "c03QryTDtl_input.mnyCd");
			EPOper.put(dtaInfo.getTpId(), "CBS0000060[0].subAcct[0]", mnyCd);
			// 币种
			String curTypCd = (String) EPOper.get(dtaInfo.getTpId(), "c03QryTDtl_input.curTypCd");
			EPOper.put(dtaInfo.getTpId(), "CBS0000060[0].currencyTyp[0]", curTypCd);
			// 钞汇标志
			String cashRemFlg = (String) EPOper.get(dtaInfo.getTpId(), "c03QryTDtl_input.cashRemFlg");
			EPOper.put(dtaInfo.getTpId(), "CBS0000060[0].cashFlg[0]", cashRemFlg);
			// 开户网点号
			String openAOEcd = (String) EPOper.get(dtaInfo.getTpId(), "c03QryTDtl_input.openAOEcd");
			EPOper.put(dtaInfo.getTpId(), "CBS0000060[0].openBrchID[0]", openAOEcd);
			// 起始日期
			String begDt = (String) EPOper.get(dtaInfo.getTpId(), "c03QryTDtl_input.begDt");
			EPOper.put(dtaInfo.getTpId(), "CBS0000060[0].bgnDt[0]", begDt);
			// 结束日期
			String finDt = (String) EPOper.get(dtaInfo.getTpId(), "c03QryTDtl_input.finDt");
			EPOper.put(dtaInfo.getTpId(), "CBS0000060[0].endDt[0]", finDt);
			// 翻页数据起始位置
			Integer begLocNum = (Integer) EPOper.get(dtaInfo.getTpId(), "c03QryTDtl_input.begLocNum");
			EPOper.put(dtaInfo.getTpId(), "CBS0000060[0].turnPageBgnPos[0]", String.valueOf(begLocNum));
			// 翻页一次显示的数量
			Integer evryPgQty = (Integer) EPOper.get(dtaInfo.getTpId(), "c03QryTDtl_input.evryPgQty");
			EPOper.put(dtaInfo.getTpId(), "CBS0000060[0].turnPageShowQnt[0]", String.valueOf(evryPgQty));
			// 获取数据对象
			sdo = EPOper.getCompSDO(dtaInfo.getTpId(), "CBS0000060");
		}
		String string = sdo.toJSON().toString();
		ObjectMapper mapper = new ObjectMapper();
		Map<?, ?> map = null;
		try {
			map = mapper.readValue(string, Map.class);
		} catch (IOException e) {
			throw new BaseException("c03QryTDtl", e);
		}
		Map<?, ?> obj = null;
		if (opTypCd == 1) {
			obj = (Map<?, ?>) (((List<?>) map.get("CBS2000020")).get(0));
		} else if (opTypCd == 2) {
			obj = (Map<?, ?>) (((List<?>) map.get("CBS0000060")).get(0));
		}
		// TrcLog.log("FormatConvert.log", obj.toString());
		((Message) dtaInfo.getMessage()).setBody(obj);
		// String data = EPOper.epToJSON(DtaInfo.getInstance().getTpId(),
		// "utf-8");
		// TrcLog.log("DataPool.log", data);
	}

	/**
	 * 添加服务码
	 */
	public String getServEcd() {
		String opTypCd = (String) EPOper.get(DtaInfo.getInstance().getTpId(), "c03QryTDtl_input.opTypCd");
		if ("1".equals(opTypCd)) {
			return "CBS2000020";
		} else if ("2".equals(opTypCd)) {
			return "CBS0000060";
		}
		return null;
	}

	/**
	 * 将ESB返回报文转换成符合渠道的格式,并给MLP日志系赋值
	 * 
	 * @return
	 */
	public void putC03SrvDataMap() {
		DtaInfo dtaInfo = DtaInfo.getInstance();
		byte[] valueByte = (byte[]) ((Message) dtaInfo.getMessage()).getBody();
		boolean valueByte2 = (valueByte == null);
		TrcLog.log("c03DataMap.log", "json: " + valueByte2);
		if (valueByte2 == false) {
			TrcLog.log("c03DataMap.log", "json: " + new String(valueByte));
			// return;
		}
		String strJson = new String(valueByte);
		// json取值
		JSONObject jsonObject = JSONObject.fromObject(strJson);
		// 客户ID
		String custID = (String) jsonObject.get("custID");
		EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].custId[0]", custID);
		EPOper.put(dtaInfo.getTpId(), "__MONS_TRAN[0].__CUST_NO[0]", custID);// 客户编号
		// 客户名称
		String custNm = (String) jsonObject.get("custNm");
		EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].custNm[0]", custNm);
		// 符合条件记录数量(总数量)
		String turnPageTotalQnt = (String) jsonObject.get("turnPageTotalQnt");
		int turnPageTotal = Integer.parseInt(turnPageTotalQnt);
		// 记录总数量[符合条件记录数量]
		EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].recTotQty[0]", turnPageTotal);
		// 判断结束标志
		String servEcd = (String) EPOper.get(dtaInfo.getTpId(), "RspBean.head.servEcd");
		if ("CBS0000061".equals(servEcd)) {// 按时间查询,判断结束标志
			// 起始位置
			String turnPageBgnPos = (String) EPOper.get(dtaInfo.getTpId(), "CBS0000060[0].turnPageBgnPos");
			int turnPageBgn = Integer.parseInt(turnPageBgnPos);
			// 请求时每页数量
			String turnPageShowQnt = (String) EPOper.get(dtaInfo.getTpId(), "CBS0000060[0].turnPageShowQnt");
			int turnPageShow = Integer.parseInt(turnPageShowQnt);
			// 起始位置数 + 每页显示数量 >= 符合条件记录数,标志为[Y]
			if (turnPageBgn + turnPageShow >= turnPageTotal) {
				EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].finFlg[0]", "Y");
			} else {
				EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].finFlg[0]", "N");
			}
		} else if ("CBS2000021".equals(servEcd)) {// 按笔数查询
			EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].finFlg[0]", "Y");
		}
		// 获取json数组
		// JSONArray jsonList = JSONArray.fromObject(jsonObject.get("list"));
		JSONArray jsonList = null;
		int count = 0;
		if (strJson.indexOf("list") != -1) {
			jsonList = (JSONArray) jsonObject.get("list");
			count = jsonList.size();
		}
		/*
		 * if (count == 0){ TrcLog.log("c03DataMap.log", "count: "+count);
		 * CompSDO compSDOs = (CompSDO) EPOper.getCompSDO(dtaInfo.getTpId(),
		 * "c03QryTDtl_output"); CompSDO sdo2 =
		 * compSDOs.getCompSDO("xfeDtlList"); FieldSDO sdo = new
		 * FieldSDO(compSDOs.getDataElement().getItemList().get("xfeDtlList"));
		 * sdo.set(sdo2);
		 * 
		 * compSDOs.getItemList().put("xfeDtlList", sdo);
		 * //sdo.getDataElemItem(). DataElemItem dataElemItem =
		 * compSDOs.getDataElement().getItemList().get("xfeDtlList"); }
		 */
		// 本次记录数量
		EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].curtRecQty[0]", count);
		// 循环数组
		for (int i = 0; i < count; i++) {
			JSONObject list = (JSONObject) jsonList.get(i);
			// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
			// curTypCd 货币类型代码
			String currencyTyp = (String) list.get("currencyTyp");
			EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].curTypCd[0]", currencyTyp);
			// cashFlg 钞汇标志
			String cashFlg = (String) list.get("cashFlg");
			EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].cashRemFlg[0]", cashFlg);
			// operNb 操作员号
			String operNb = (String) list.get("operNb");
			EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].operNo[0]", operNb);
			// loanCreditFlg 借贷标志
			String loanCreditFlg = (String) list.get("loanCreditFlg");
			EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].drcrFlg[0]", loanCreditFlg);
			// debitAmt 借方发生额
			String debitAmt = (String) list.get("debitAmt");
			if (!StringTool.isNullOrEmpty(debitAmt))
				EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].drOccrAmt[0]",
						Double.parseDouble(debitAmt));
			// creditAmt 贷方发生额
			String creditAmt = (String) list.get("creditAmt");
			if (!StringTool.isNullOrEmpty(creditAmt))
				EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].crOccrAmt[0]",
						Double.parseDouble(creditAmt));
			// bal 余额
			String bal = (String) list.get("bal");
			if (!StringTool.isNullOrEmpty(bal))
				EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].fundBal[0]",
						Double.parseDouble(bal));
			// avlBal 可用余额
			String avlBal = (String) list.get("avlBal");
			if (!StringTool.isNullOrEmpty(avlBal))
				EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].avlBal[0]",
						Double.parseDouble(avlBal));
			// oppoAcct 对方账号
			String oppoAcct = (String) list.get("oppoAcct");
			EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].opntA[0]", oppoAcct);
			// oppoAcctNm 对方账户名
			String oppoAcctNm = (String) list.get("oppoAcctNm");
			EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].opntANm[0]", oppoAcctNm);
			// transSeqNb 交易流水号
			String transSeqNb = (String) list.get("transSeqNb");
			EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].tSN[0]", transSeqNb);
			// tranDt 交易日期
			String tranDt = (String) list.get("tranDt");
			EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].tDt[0]", tranDt);
			// tranBrchID 交易网点代码
			String tranBrchID = (String) list.get("tranBrchID");
			EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].tOEcd[0]", tranBrchID);
			// transBrchNm 交易网点名称
			String transBrchNm = (String) list.get("transBrchNm");
			EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].tONm[0]", transBrchNm);
			// transBrchNmSt 交易网点简称
			String transBrchNmSt = (String) list.get("transBrchNmSt");
			EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].tOAbbr[0]", transBrchNmSt);
			// transChnl 交易渠道
			String transChnl = (String) list.get("transChnl");
			EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].tChnlCd[0]", transChnl);
			// voucherNo 凭证号
			String voucherNo = (String) list.get("voucherNo");
			EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].vchrNo[0]", voucherNo);
			// remarkCd 摘要代码
			String remarkCd = (String) list.get("remarkCd");
			EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].sumCd[0]", remarkCd);
			// remark 摘要
			String remark = (String) list.get("remark");
			EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].sumDesc[0]", remark);
			// memo 备注
			String memo = (String) list.get("memo");
			EPOper.put(dtaInfo.getTpId(), "c03QryTDtl_output[0].xfeDtlList[" + i + "].infoRmk[0]", memo);
		}
		String dbDt = getDbDt();
		EPOper.put(dtaInfo.getTpId(), "__MONS_TRAN[0].__TRAN_DATE[0]", dbDt);// 交易日期
		String initrSeqno = (String) EPOper.get(dtaInfo.getTpId(), "ReqBean[0].head[0].initrSeqno");
		EPOper.put(dtaInfo.getTpId(), "__MONS_TRAN[0].__ESWT_SEQ[0]", initrSeqno);// 交易流水
		String servInitrBrch = (String) EPOper.get(dtaInfo.getTpId(), "ReqBean[0].head[0].servInitrBrch");
		EPOper.put(dtaInfo.getTpId(), "__MONS_TRAN[0].__BRCH_NO[0]", servInitrBrch);// 请求机构号

	}

	/***
	 * 判断是否长期未登录
	 */
	public void getNoLongLgnFlag() {
		String lastDt = (String) EPOper.get(DtaInfo.getInstance().getTpId(), "c04QryUsrLastLgnInfo_output[0].lgnDt[0]");
		String nowDt = PubBean.getNowDate();
		String param = (String) EPOper.get(DtaInfo.getInstance().getTpId(),
				"c04InvctQryParm_output[0].c04InvctParm[0].parmPrtclCntnt[0]");
		boolean b = isNull("c04InvctQryParm_output.c04InvctParm.parmPrtclCntnt");
		if (b == true)
			throw new BaseException("","休眠参数查询失败");
		TrcLog.log("test.log", "lastDt:" + lastDt);
		TrcLog.log("test.log", "nowDt:" + nowDt);
		TrcLog.log("test.log", "param:" + param);
		long interval = getTwoDay(nowDt, lastDt);
		long pam = Long.parseLong(param);

		if (interval >= pam) {
			EPOper.put(DtaInfo.getInstance().getTpId(), "CertnFlag[0].noLgn[0]", 1);// 长期未登录

		} else {
			EPOper.put(DtaInfo.getInstance().getTpId(), "CertnFlag[0].noLgn[0]", 0);// 非长期未登录
		}

	}

	public String getServCertnParm() {
		int noLgn = (int) EPOper.get(DtaInfo.getInstance().getTpId(), "CertnFlag[0].noLgn[0]");
		int noEqp = (int) EPOper.get(DtaInfo.getInstance().getTpId(), "CertnFlag[0].noEqp[0]");
		String union = noLgn + "" + noEqp;
		if (union.equals("00")) {
			EPOper.put(DtaInfo.getInstance().getTpId(), "RspBean.head.respsInfoDesc[0]", "交易成功");// 交易成功
		} else if (union.equals("01")) {
			EPOper.put(DtaInfo.getInstance().getTpId(), "RspBean.head.respsInfoDesc[0]", "新设备，需要进行二次认证");// 非长期未登录
		} else if (union.equals("10")) {
			EPOper.put(DtaInfo.getInstance().getTpId(), "RspBean.head.respsInfoDesc[0]", "长期未登录，需要进行二次认证");// 非长期未登录
		} else if (union.equals("11")) {
			EPOper.put(DtaInfo.getInstance().getTpId(), "RspBean.head.respsInfoDesc[0]", "新设备+长期未登录，需要进行二次认证");// 非长期未登录
		}
		return union;

	}

	/**
	 * 得到二个日期间的间隔天数
	 */
	public static long getTwoDay(String sj1, String sj2) {
		String pattern = "yyyyMMdd";
		SimpleDateFormat formatter = new SimpleDateFormat(pattern);
		long day = 0;
		try {
			java.util.Date date = formatter.parse(sj1);
			java.util.Date mydate = formatter.parse(sj2);
			day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000);
		} catch (Exception e) {
			return 0;
		}
		return day;
	}



	/**
	 * 获取延迟一分钟的时间
	 */
	public static String getFinlUpdTmLiJL() {
		Calendar c = Calendar.getInstance();
		c.add(Calendar.MINUTE, 1);
		Date date = c.getTime();
		DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		String finlUpdTm = df.format(date);
		return finlUpdTm;
	}

	/**
	 * 获取UUID
	 * 
	 * @return
	 */
	public static String getUUID() {
		String str = UUID.randomUUID().toString();
		str = str.replace("-", "");
		return str;
	}

	/**
	 * 从时间戳中截取日期
	 * 
	 * @param dateTime
	 *            时间戳
	 * @return 日期
	 */
	public String getDtFromDttm(String dateTime) {
		return dateTime.substring(0, 10);
	}

	/**
	 * 从时间戳中截取时间
	 * 
	 * @param dateTime
	 *            时间戳
	 * @return 时间
	 */
	public String getTmFromDttm(String dateTime) {
		return dateTime.substring(11, 19);
	}

	/**
	 * @author 李泽阳 通用获取32位流水号，合作机构编码+机器节点+时间+流水号
	 * 
	 * @param seqNm
	 *            流水号标识
	 * @return 32位流水号
	 */
	public String sysSeq_32(String seqNm) {
		int seq = StarringSeq.getCustomSeq(seqNm); // 获取订单流水号
		String seqNo = String.format("%011d", seq);// 11位流水号
		DtaInfo dtaInfo = DtaInfo.getInstance();
		String servInitrBrch = (String) EPOper.get(dtaInfo.getTpId(), "ReqBean[0].head[0].servInitrBrch");
		if (servInitrBrch.length() > 4) {
			servInitrBrch.substring(0, 4);
		}
		while (servInitrBrch.length() < 4) {
			servInitrBrch = "0" + servInitrBrch;
		}
		String nodeName = dtaInfo.getNodeName(); // 取机器节点号
		int nodeNo = Integer.parseInt(nodeName); // 转化为整型的节点号
		String seqName = String.format("%03d", nodeNo);// 3位节点名
		String rcdId = servInitrBrch + seqName + getCreTm() + seqNo;
		return rcdId;
	}

	/**
	 * 新32位生成订单号方法 10商户号 + 14:时间 + 3:机器节点号 + 5:流水号
	 * 
	 * @return
	 */
	public String newSysSeq_32(String mertid) {
		int seq = StarringSeq.getCustomSeq("15"); // 获取订单流水号
		String seqNo = String.format("%05d", seq);// 5位流水号
		DtaInfo dtaInfo = DtaInfo.getInstance();
		String nodeName = dtaInfo.getNodeName(); // 取机器节点号
		int nodeNo = Integer.parseInt(nodeName); // 转化为整型的节点号
		String seqName = String.format("%03d", nodeNo);// 3位节点名
		String rcdId = mertid + getCreTm() + seqName + seqNo;
		TrcLog.log("ordSeq.log", rcdId);
		if (rcdId.length() == 32) {
			return rcdId;
		} else {
			throw new BaseException("生成流水号异常");
		}
		// String rcdId = servInitrBrch + seqName + getCreTm() + seqNo;
	}

	/**
	 * @author 李泽阳 获取订单流水号
	 * 
	 * @return 订单流水号
	 */
	public String ordSeq(String element, String mertid) {
		if (StringTool.isNullOrEmpty(element))
			return newSysSeq_32(mertid);
		else
			return element;
	}

	/**
	 * @author 李泽阳 获取订单支付结算流水号
	 * 
	 * @return 订单支付结算流水号
	 */
	public String ordPymtStlSeq() {
		return sysSeq_32("6");
	}

	/**
	 * @author 李泽阳 获取金融交易流水号
	 * 
	 * @return 金融交易流水号
	 */
	public String ordFntSeq() {
		return sysSeq_32("7");
	}

	/**
	 * @author 李泽阳 获取预约任务流水号
	 * 
	 * @return 预约任务流水号
	 */
	public String resvOrdSeq() {
		return sysSeq_32("8");
	}

	/**
	 * 静态方法 通用获取32位流水号，合作机构编码+机器节点+时间+流水号
	 * 
	 * @param seqNm
	 *            流水号标识
	 * @return 32位流水号
	 */
	public static String stc_sysSeq32(String seqNm) {
		int seq = StarringSeq.getCustomSeq(seqNm); // 获取订单流水号
		String seqNo = String.format("%011d", seq);// 11位流水号
		DtaInfo dtaInfo = DtaInfo.getInstance();
		String servInitrBrch = (String) EPOper.get(dtaInfo.getTpId(), "ReqBean[0].head[0].servInitrBrch");
		if (!StringTool.isNullOrEmpty(servInitrBrch) && servInitrBrch.length() > 4) {
			servInitrBrch.substring(0, 4);
		} else {
			servInitrBrch = "0000";
		}
		String nodeName = dtaInfo.getNodeName(); // 取机器节点号
		int nodeNo = Integer.parseInt(nodeName); // 转化为整型的节点号
		String seqName = String.format("%03d", nodeNo);// 3位节点名
		String rcdId = servInitrBrch + seqName + getCreTm() + seqNo;
		return rcdId;
	}

	/**
	 * @author 获取商户体系流水号
	 * 
	 * @return 预约任务流水号
	 */
	public static String stc_mertSeq() {
		return stc_sysSeq32("11");
	}

	public static String stc_txSeq() {
		return stc_sysSeq32("14");
	}

	/**
	 * @author 获取工作流编号
	 * 
	 * @return 工作流编号
	 */
	public static String stc_WorkNo() {
		return stc_sysSeq32("12");
	}
	public static String stc_NXY_WorkNo() {
		return stc_sysSeq32("7");
	}

	/**
	 * @author 获取工作流流水号
	 * 
	 * @return 工作流流水号
	 */
	public static String stc_WorkSeq() {
		return stc_sysSeq32("10");
	}
	public static String stc_NXY_WorkSeq() {
		return stc_sysSeq32("8");
	}
	/**
	 * @author 李泽阳 将带有“-”的日期转换为无“-”的简单日期
	 * @param dbDt
	 * @return
	 */
	public String dbDtToSplDt(String dbDt) {
		DateFormat df1 = new SimpleDateFormat("yyyy-MM-dd");
		DateFormat df2 = new SimpleDateFormat("yyyyMMdd");
		Date dt;
		try {
			dt = df1.parse(dbDt);
		} catch (ParseException e) {
			throw new BaseException("PCA3005", e, dbDt);
		}
		return df2.format(dt);
	}

	/**
	 * @author 李泽阳 将不带有“-”的日期转换为带有“-”的日期

	 * @return
	 */
	public String splDtToDbDt(String dt) {
		DateFormat df1 = new SimpleDateFormat("yyyyMMdd");
		DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd");
		Date dbDt;
		try {
			dbDt = df1.parse(dt);
		} catch (ParseException e) {
			throw new BaseException("PCA3005", e, dt);
		}
		return df2.format(dbDt);
	}

	/**
	 * 获取随机数
	 * 
	 * @return
	 */
	public String nonceStr() {
		UUID uuid = UUID.randomUUID();
		String all = uuid.toString().replaceAll("-", "");
		return all;
	}

	public String getChnlSeq() {
		return getChnlSeq("");
	}

	public String getChnlSeq(String appOEcd) {
		/* 取序号发生器生成的值 */
		int seq = StarringSeq.getCustomSeq("9");

		DtaInfo dtaInfo = DtaInfo.getInstance();
		String nodeName = dtaInfo.getNodeName(); // 取机器节点号
		int nodeNo = Integer.parseInt(nodeName); // 转化为整型的节点号
		String seqName = String.format("%03d", nodeNo);// 3位节点名

		String seqNo = String.format("%07d", seq);

		String servInitrBrch = StringTool.isNullOrEmpty(appOEcd)
				? (String) EPOper.get(dtaInfo.getTpId(), "ReqBean[0].head[0].servInitrBrch") : appOEcd;
		int int1 = Integer.parseInt(servInitrBrch);
		String InitrBrch = "";
		switch (int1) {
		case 5200:
			InitrBrch = "1";
			break;
		case 2200:
			InitrBrch = "2";
			break;
		case 9400:
			InitrBrch = "1";
			break;
		}

		return seqName + new SimpleDateFormat("HHmm").format(new Date()) + InitrBrch + seqNo;
	}

	/**
	 * 判断返回成功失败
	 * 
	 * @return
	 */
	public boolean resp() {
		DtaInfo dtaInfo = DtaInfo.getInstance();
		String returnCode = (String) EPOper.get(dtaInfo.getTpId(), "s06CrePymtOrd_output[0].returnCode");
		String returnMsg = (String) EPOper.get(dtaInfo.getTpId(), "s06CrePymtOrd_output[0].returnMsg");
		String pymtChnlCd = (String) EPOper.get(dtaInfo.getTpId(), "s06AddPymtOrd_input[0].pymtChnlCd");
		if ("7".equals(pymtChnlCd)) {
			if ("10000".equals(returnCode) && "Success".equals(returnMsg))
				return true;
		} else if ("8".equals(pymtChnlCd)) {
			if ("SUCCESS".equals(returnCode) && "SUCCESS".equals(returnMsg))
				return true;
		}
		/*if ("SUCCESS".equals(returnCode) || "10000".equals(returnCode))
			if ("SUCCESS".equals(returnMsg) || "Success".equals(returnMsg))
				return true;*/
		return false;
	}

	/**
	 * 生成流水号
	 * 
	 * @return
	 */
	public static String petDbDt() {
		Date date = new Date();
		DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
		String dbDt = df.format(date);
		UUID uuid = UUID.randomUUID();
		String all = uuid.toString().replaceAll("-", "");
		String date2 = dbDt + all;
		String string = date2.substring(0, 32);
		return string;
	}

    /**
     * 数据转移(值列表->属性名列表)
     * 
     * @param srcArr
     *            源值列表
     * @param tagSdo
     *            目标对象SDO（数据库表对象）
     * @author gongxl 2018-3-14
     */
    public static void copy(Object[] srcArr, String[] tagEles, CompSDO tagSdo) {
        copy(srcArr, tagEles, tagSdo, true);
    }

	/**
	 * 数据转移(值列表->属性名列表)
	 * 
	 * @param srcArr
	 *            源值列表
	 * @param tagSdo
	 *            目标对象SDO（数据库表对象）
	 * @author gongxl 2018-3-14
	 */
	public static void copy(String[] srcArr, String[] tagEles, CompSDO tagSdo) {
		copy(srcArr, tagEles, tagSdo, true);
	}

	/**
	 * 数据转移(值列表->属性名列表)
	 * 
	 * @param srcArr
	 *            源值列表
	 * @param tagSdo
	 *            目标对象SDO（数据库表对象）
	 * @param flag
	 *            true-为空也赋值
	 * @author gongxl 2018-3-14
	 */
	public static void copy(String[] srcArr, String[] tagEles, CompSDO tagSdo, Boolean flag) {
		for (int i = 0; i < srcArr.length && i < tagEles.length; i++) {
			if (flag || !StringTool.isNullOrEmpty(srcArr[i])) {
				tagSdo.setValue(tagEles[i], srcArr[i]);
			}
		}
	}
	
    /**
     * 数据转移(值列表->属性名列表)
     * 
     * @param srcArr
     *            源值列表
     * @param tagSdo
     *            目标对象SDO（数据库表对象）
     * @param flag
     *            true-为空也赋值
     * @author gongxl 2018-3-14
     */
    public static void copy(Object[] srcArr, String[] tagEles, CompSDO tagSdo, Boolean flag) {
        for (int i = 0; i < srcArr.length && i < tagEles.length; i++) {
            if(flag || (srcArr[i] instanceof String && StringTool.isNullOrEmpty((String)srcArr[i]) || srcArr[i] != null))
                tagSdo.setValue(tagEles[i], srcArr[i]);
        }
    }
	
	/**
	 * 数据转移
	 * 
	 * @param srcEles
	 *            源属性列表（输入对象）
	 * @param tagEles
	 *            目标属性列表（数据库表对象）
	 * @param srcSdo
	 *            源对象SDO（输入对象）
	 * @param tagSdo
	 *            目标对象SDO（数据库表对象）
	 * @author gongxl 2018-3-14
	 */
	public static void copy(String[] srcEles, String[] tagEles, CompSDO srcSdo, CompSDO tagSdo) {
		copy(srcEles, tagEles, srcSdo, tagSdo, true);
	}

	/**
	 * 数据转移
	 * 
	 * @param srcEles
	 *            源属性列表（输入对象）
	 * @param tagEles
	 *            目标属性列表（数据库表对象）
	 * @param srcSdo
	 *            源对象SDO（输入对象）
	 * @param tagSdo
	 *            目标对象SDO（数据库表对象）
	 * @param flag
	 *            true-为空也赋值
	 * @author gongxl 2018-3-14
	 */
	public static void copy(String[] srcEles, String[] tagEles, CompSDO srcSdo, CompSDO tagSdo, Boolean flag) {
		Object obj = null;
		for (int i = 0; i < srcEles.length && i < tagEles.length; i++) {
			obj = srcSdo.getValue(srcEles[i]);
			if (obj == null || (obj instanceof String && "".equals(obj))) {
				if (!flag)
					continue;
			}
			tagSdo.setValue(tagEles[i], srcSdo.getValue(srcEles[i]));
		}
	}

	/**
	 * 请求报文的空值判断
	 * 
	 * @param eleArr
	 * @param inputSdi
	 */
	public static void judgeNull(String[] eleArr, String[] errMsgArr, CompSDO inputSdo) {
		Object obj = null;
		for (int i = 0; i < eleArr.length && i < errMsgArr.length; i++) {
			obj = inputSdo.getValue(eleArr[i]);
			if (obj == null || (obj instanceof String && "".equals(obj))) {
				throw new BaseException("PCA1000", errMsgArr[i]);
			}
		}
	}

	/**
	 * 空值校验
	 */
	public static void judgeNull(Object[] valArr, String[] errDescArr) {
		Object obj = null;
		for (int i = 0; i < valArr.length && i < errDescArr.length; i++) {
			obj = valArr[i];
			if (obj == null || (obj instanceof String && "".equals(obj))) {
				throw new BaseException("PCA1000", errDescArr[i]);
			}
		}
	}

	/**
	 * 设置返回码
	 * 
	 * @param tpId
	 * @param code
	 *            返回码
	 * @param desc
	 *            返回信息
	 * @author gongxl 2018-3-14
	 */
	public static void setRspsInfo(String tpId, String code, String desc) {
		EPOper.put(tpId, "RspBean[0].head[0].rspsCd[0]", code);
		EPOper.put(tpId, "RspBean[0].head[0].respsInfoDesc[0]", desc);
	}

	public void putItemData(String name) {
		DtaInfo dtaInfo = DtaInfo.getInstance();
		CompSDO sdo = EPOper.getCompSDO(dtaInfo.getTpId(), name);
		String json = sdo.toJSON();
		EPOper.put(dtaInfo.getTpId(), "__GDTA_FORMAT[0].__GDTA_ITEMDATA", json);
	}

	public String getCfmCd(String ordSN, String creTm) {
		int ordSN_last4 = Integer.parseInt(ordSN.substring(ordSN.length() - 4, ordSN.length()));
		creTm = creTm.replace("-", "").replace(":", "").replace(" ", "");
		int creTm_last4 = Integer.parseInt(creTm.substring(creTm.length() - 4, creTm.length()));
		int cfmCd_int = ordSN_last4 ^ creTm_last4;
		String cfmCd = String.format("%04d", cfmCd_int);
		return cfmCd;
	}

	private static char[] char36Set = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();

	/**
	 * 获取新二维码编号
	 *
	 * @author gongxl 2018-3-23
	 */
	public static String getNewQrCdNo() {
		int len = char36Set.length;
		// 取thd_provider.xml配置的redisCluster
		Long rest = System.currentTimeMillis() + CpfsFeAllConfig.jedisCluster.incr("NXY_QR_CD_NO");
		Stack<Character> stack = new Stack<Character>();
		StringBuilder result = new StringBuilder(0);
		while (rest != 0) {
			stack.add(char36Set[new Long((rest - (rest / len) * len)).intValue()]);
			rest = rest / len;
		}
		for (; !stack.isEmpty();) {
			result.append(stack.pop());
		}
		return result.toString();
	}

	/**
	 * 获取商户ID：10位长度，前2位为合作机构编码前两位，后8位为自增数字，数据保存在redis数据库中
	 *
	 * @author gongxl 2018-3-30
	 */
	public static String getMertId() {
		DtaInfo dtaInfo = DtaInfo.getInstance();
		String servInitrBrch = (String) EPOper.get(dtaInfo.getTpId(), "ReqBean[0].head[0].servInitrBrch");
		String servInitrBrch2Pre = servInitrBrch.substring(0, 2);
		// 取thd_provider.xml配置的redisCluster
		String key = servInitrBrch2Pre + "_NXY_MERT_ID";
		// 2位合作机构编码+8位为自增序号
		return servInitrBrch2Pre + String.format("%08d", CpfsFeAllConfig.jedisCluster.incr(key));
	}

	/**
	 * 农信通获取商户ID：10位长度，前4位为合作机构编码前两位，接着三位节点号后,8位为自增数字，数据保存在redis数据库中,
	 *
	 * @author gongxl 2018-3-30
	 */
	public static String getNXTMertId() {
		DtaInfo dtaInfo = DtaInfo.getInstance();
		String servInitrBrch = (String) EPOper.get(dtaInfo.getTpId(), "ReqBean[0].head[0].servInitrBrch");
		String brch = servInitrBrch.substring(0, 4);
		// 取机器节点号
		String nodeName = DtaInfo.getInstance().getNodeName();
		int nodeNo = Integer.parseInt(nodeName); // 转化为整型的节点号
		String seqName = String.format("%03d", nodeNo);// 3位节点名
		// 取thd_provider.xml配置的redisCluster
		String key = brch + "_NXT_MERT_ID";
		// 2位合作机构编码+8位为自增序号
		return brch + seqName + String.format("%08d", CpfsFeAllConfig.jedisCluster.incr(key));
	}

	/**
	 * 获取二维码批次号
	 *
	 * @author wanjk 2018-3-23
	 */
	public static String getBatNo() {
		// 取thd_provider.xml配置的redisCluster
		Long redisNo = CpfsFeAllConfig.jedisCluster.incr("NXY_QR_CD_BAT_NO");// 农信银二维码批次号序号
		// 超过10位就初始化
		if (redisNo == 999999999l) {
			CpfsFeAllConfig.jedisCluster.set("NXY_QR_CD_BAT_NO", "0");
		}
		/* 批次号=6位日期+9位redis序号 */
		return getNowDate().substring(2) + String.format("%09d", redisNo);
	}

	/**
	 * 获取交易序号（3位节点号+9位序号）
	 * 
	 * @return
	 */
	public static String getTSeqNo() {
		/* 获取9位流水号 */
		int seq = StarringSeq.getCustomSeq("14");
		String seqNo = String.format("%09d", seq);
		String nodeName = DtaInfo.getInstance().getNodeName();// 取机器节点号
		int nodeNo = Integer.parseInt(nodeName); // 转化为整型的节点号
		String seqName = String.format("%03d", nodeNo);// 3位节点名
		return seqName + seqNo;
	}

	/**
	 * 新增操作
	 * 
	 * @author wanjk
	 * @return 2018-3-26
	 */
	public static void setCreSdo(CompSDO tblSdo) {
		String tpId = DtaInfo.getInstance().getTpId();
		// 获取合作机构编码
		String asscOEcd = (String) EPOper.get(tpId, "ReqBean[0].head[0].servInitrBrch[0]");
		/* 创建操作人员 */
		String usrId = (String) EPOper.get(tpId, "ReqBean[0].head[0].usrId[0]");
		/* 创建时间 */
		String opTime = getFinlUpdTm();
		// 新增操作记录创建人、创建时间、创建机构
		String[] srcArr = new String[] { usrId, opTime, asscOEcd };
		String[] tagArr = new String[] { "CRE_OPRT_PSNL_ID", "CRE_TM", "CRE_BRCHENCD" };
		copy(srcArr, tagArr, tblSdo);
	}

	/**
	 * 更新操作
	 * 
	 * @author wanjk
	 * @param tblSdo
	 *            2018-3-26
	 */
	public static void setFinSdo(CompSDO tblSdo) {
		String tpId = DtaInfo.getInstance().getTpId();
		// 获取合作机构编码
		String asscOEcd = (String) EPOper.get(tpId, "ReqBean[0].head[0].servInitrBrch[0]");
		/* 创建操作人员 */
		String usrId = (String) EPOper.get(tpId, "ReqBean[0].head[0].usrId[0]");
		/* 创建时间 */
		String opTime = getFinlUpdTm();
		// 更新操作记录创建人、创建时间、创建机构
		String[] srcArr = new String[] { usrId, opTime, asscOEcd };
		String[] tagArr = new String[] { "FINL_UPD_OPRT_PSNLID", "FINL_UPD_TM", "FINL_UPDT_O_ECD" };
		copy(srcArr, tagArr, tblSdo);
	}

	/**
	 * 新增sql，获取创建时间，创建人，创建机构
	 * 
	 * @return 2018-3-26
	 */
	public static String getCreSql() {
		String tpId = DtaInfo.getInstance().getTpId();
		// 获取合作机构编码
		String asscOEcd = (String) EPOper.get(tpId, "ReqBean[0].head[0].servInitrBrch[0]");
		/* 创建操作人员 */
		String usrId = (String) EPOper.get(tpId, "ReqBean[0].head[0].usrId[0]");
		/* 创建时间 */
		String opTime = getFinlUpdTm();
		/* 创建时间 */
		String opTm = "CRE_TM = '" + opTime + "'";
		/* 创建操作人员 */
		String urId = "CRE_OPRT_PSNL_ID = '" + usrId + "'";
		/* 创建机构 */
		String acOd = "CRE_BRCHENCD = '" + asscOEcd + "'";
		return opTm + "," + urId + "," + acOd;
	}

	/**
	 * 更新sql，获取最后更新时间，更新人，更新机构
	 * 
	 * @return 2018-3-26
	 */
	public static String getFinSql() {
		String tpId = DtaInfo.getInstance().getTpId();
		// 获取合作机构编码
		String asscOEcd = (String) EPOper.get(tpId, "ReqBean[0].head[0].servInitrBrch[0]");
		/* 创建操作人员 */
		String usrId = (String) EPOper.get(tpId, "ReqBean[0].head[0].usrId[0]");
		/* 创建时间 */
		String opTime = getFinlUpdTm();
		/* 最后更新时间 */
		String opTm = "FINL_UPD_TM = '" + opTime + "'";
		/* 最后更新人 */
		String urId = "FINL_UPD_OPRT_PSNLID = '" + usrId + "'";
		/* 最后更新机构 */
		String acOd = "FINL_UPDT_O_ECD = '" + asscOEcd + "'";
		return opTm + "," + urId + "," + acOd;
	}

	/**
	 * 判断金额
	 * 
	 * @param element
	 * @param count
	 * @return
	 */
	public static Boolean dubSmallAndBig(String element, int count) {
		String reqAmt = (String) EPOper.get(DtaInfo.getInstance().getTpId(), element);
		if (Double.parseDouble(reqAmt) > count)
			return true;
		else
			return false;
	}

	/**
	 * <p>
	 * 设置查询清单结果（参考s13QryFeRlList服务）
	 * </p>
	 * <p>
	 * 要求： 1、输入对象名=svrName + "_input",且包含begLocNum和evryPgQty
	 * </p>
	 * <p>
	 * 2、输出对象名=SVRName + "_output",且包含recTotQty、curtRecQty和finFlg
	 * </p>
	 * <p>
	 * 3、输出对象下必须包含类别名为'objName'，属性名为circInfo的数据对象属性
	 * </p>
	 * <p>
	 * 4、总条数在qryListRsltNum对象的recordAmt字段
	 * </p>
	 * 
	 * @param svrName
	 *            服务名
	 * @param objName
	 *            循环的对象名
	 * @author gongxl 2018-3-29
	 */
	public static void setQryListRst(String svrName, String objName) {
		String tpId = DtaInfo.getInstance().getTpId();
		Integer record = (Integer) EPOper.get(tpId, "__PLAT_SQL[0].__RECORD_REC[0]");
		Integer sum = (Integer) EPOper.get(tpId, "qryListRsltNum[0].recordAmt[0]");
		if (record == null || record == 0) {
			EPOper.put(tpId, svrName + "_output[0].recTotQty", sum);
			EPOper.put(tpId, svrName + "_output[0].curtRecQty", 0);
			EPOper.put(tpId, svrName + "_output[0].finFlg", "Y");
			setRspsInfo(tpId, "0000000", "查询记录为空");
			return;
		}
		EPOper.put(tpId, svrName + "_output[0].recTotQty", sum);
		EPOper.put(tpId, svrName + "_output[0].curtRecQty", record);

		Integer begLocNum = (Integer) EPOper.get(tpId, svrName + "_input[0].begLocNum");
		if (begLocNum + record >= sum) {
			EPOper.put(tpId, svrName + "_output[0].finFlg", "Y");
		} else {
			EPOper.put(tpId, svrName + "_output[0].finFlg", "N");
		}

		Object list = EPOper.getList(tpId, objName);
		EPOper.put(tpId, svrName + "_output[0].circInfo", list);
	}

	/**
	 * 判断分页标志是否存在
	 * <p>
	 * 要求： 1、输入对象名=svrName + "_input",且包含begLocNum和evryPgQty
	 * </p>
	 * 
	 * @param svrName
	 * @return
	 */
	public static boolean chkPageParm(String svrName) {
		String tpId = DtaInfo.getInstance().getTpId();
		CompSDO inputSdo = (CompSDO) EPOper.getCompSDO(tpId, svrName + "_input");
		Integer begLocNum = (Integer) inputSdo.getValue("begLocNum");
		if (begLocNum == null) {
			return false;
		}
		Integer evryPgQty = (Integer) inputSdo.getValue("evryPgQty");
		if (evryPgQty == null) {
			return false;
		}
		return true;

	}

	/**
	 * 拆分商户appid
	 * 
	 * @author 李泽阳
	 * @param str
	 *            数据库中的字段
	 * @param index
	 *            索引
	 * @return 拆分结果
	 */
	public static String splitAppid(String str, int index) {
		if (StringTool.isNullOrEmpty(str))
			return null;
		String[] strs = str.split("\\|");
		if (index >= strs.length)
			return null;
		return strs[index];
	}

	/**
	 * 打印日志
	 * 
	 * @author 李泽阳
	 * @param filename
	 *            日志文件名称
	 * @param content
	 *            打印内容
	 */
	public static void log(String filename, String content) {
		TrcLog.log(filename, content);
	}

	/**
	 * 获取周期日(T+N)
	 * <p>
	 * 如果周期代码是0(实时)，周期值可为空，则周期日N=0;
	 * </p>
	 * <p>
	 * 如果周期代码是1(日)，周期值为D，则周期日N=D;
	 * </p>
	 * <p>
	 * 如果周期代码是2(周)，周期值为W(1-7)，则周期日N是距离下次周W的天数;
	 * </p>
	 * <p>
	 * 如果周期代码是3(半月)，周期值为X(1-15)，则周期日N是距离下次X(+15)号的天数;
	 * </p>
	 * <p>
	 * 如果周期代码是4(月)，周期值为M(1-30)，则周期日N是距离下次M号的天数，如果是2月份，且周期值为30则跳到3月结算;
	 * </p>
	 * <p>
	 * 如果周期代码是5(季)，周期值为S(1-90)，则周期日N是距离最近一次季度第S天的天数
	 * </p>
	 * <p>
	 * 如果周期代码是6(半年)，周期值为y(1-180)，则周期日N是距离最近一次半年第y天的天数
	 * </p>
	 * <p>
	 * 如果周期代码是7(年)，周期值为Y(MMDD)，则周期日N是距离下次MM月DD日的天数
	 * </p>
	 * <p>
	 * 如果周期代码是8(场次)，一日多场结算，需要单独设计
	 * </p>
	 * 
	 * @param date
	 *            日期(T)：yyyy-MM-dd
	 * @param cycCd
	 *            周期代码:0-实时;1-日;2-周;3-半月;4-月;5-季;6-半年;7-年;8-场
	 * @param cycVal
	 *            周期值: 周（1-7代表周一到周日）;半月（1-15代表离半月1-15天）;
	 *            月（1-30代表每月1号-30号）;季（1-90代表每季度第1-90天）;
	 *            半年（1-180代表离半年第一天多少天）;年（MMDD代表MM月DD日）; 场（一日多场）
	 * @author gongxl 2018-3-31
	 */
	public static String getCycDay(String date, String cycCd, String cycVal) {
		String setlMeth = "1";// 默认T+1结算
		if ("0".equals(cycCd)) {// 实时结算
			setlMeth = "0";
		} else if ("1".equals(cycCd)) {// 按日结算
			setlMeth = cycVal;
		}
		// TODO 其他周期代码的周期日待计算
		return setlMeth;
	}

	/*
	 * 请求报文头赋值
	 * 
	 * @author chenshx 2018-3-31
	 */
	public static String reqHeadPut(String tpId, String szSvc) {
		String txSeq = stc_txSeq();
		EPOper.put(tpId, "ReqBean[0].head[0].servInitrBrch", "0000");
		EPOper.put(tpId, "ReqBean[0].head[0].initrSeqno", txSeq);
		EPOper.put(tpId, "ReqBean[0].head[0].servEcd", szSvc);
        EPOper.put(tpId, "ReqBean[0].head[0].initrTmStmp", PubBean.getFinlUpdTm());
		return txSeq;
	}

	/**
	 * 从Redis获取自增序号
	 * 
	 * @param key
	 *            键值
	 * @return
	 */
	private static Long getRedisNo(String key) {
		return CpfsFeAllConfig.jedisCluster.incr(key);
	}

	/**
	 * 获取分润规则序号
	 * 
	 * @return SHRP+5位redis序号
	 * @author gongxl @2018-4-12
	 */
	public static String getShrPftRlSerNO() {
		Long no = getRedisNo("SHRP_RL_NO");
		/* 批次号=SHRP+5位redis序号 */
		return "SHRP" + String.format("%05d", no);
	}

	/**
	 * 获取手续费规则序号
	 * 
	 * @return FEES+5位redis序号
	 * @author gongxl @2018-4-12
	 */
	public static String getFeRlSerNO() {
		Long no = getRedisNo("FEES_RL_NO");
		return "FEES" + String.format("%05d", no);
	}

	/**
	 * 获取结算规则序号
	 * 
	 * @return SETL+5位redis序号
	 * @author gongxl @2018-4-12
	 */
	public static String getRlSerNO() {
		/* 批次号=SETL+5位redis序号 */
		Long no = getRedisNo("SETL_RL_NO");
		return "SETL" + String.format("%05d", no);
	}

	/**
	 * 获取清算日期时间(yyyy-MM-dd)
	 * 
	 * @return
	 */
	public String getClrgDt() {
		Date date = new Date();
		DateFormat df = new SimpleDateFormat("yyyyMMddHHmmssSSS");
		DateFormat df2 = new SimpleDateFormat("yyyyMMdd");
		DateFormat df3 = new SimpleDateFormat("yyyy-MM-dd");
		String finlUpdTm = df.format(date);
		String finlUpdTm2 = df2.format(date);
		String date2 = finlUpdTm2 + "232959999";
		if (Long.parseLong(finlUpdTm) <= Long.parseLong(date2)) {
			return df3.format(date);
		} else {
			Calendar cal = Calendar.getInstance();
			cal.setTime(date);
			cal.add(Calendar.DAY_OF_MONTH, 1);
			return df3.format(cal.getTime());
		}
	}

	/**
	 * 商户号模值
	 * 
	 * @return
	 */
	public static int getMertGrpNo(String ordSN) {
		return Math.abs(ordSN.substring(0, 10).hashCode()) % InsideConfig.MERT_MOL_NUM;
	}

	/**
	 * 订单号模值
	 * 
	 * @return
	 */
	public int getMertGrpNoFromOrdNo(String ordNo) {
		return getMertGrpNo(ordNo);
	}

	public void callSubSvcDepend() {
		SvcDepend svcDepend = new SvcDepend();
		svcDepend.setSrcType("C");
		DtaInfo dtaInfo = DtaInfo.getInstance();
		String dtaNm = dtaInfo.getDtaName();
		String svcNm = dtaInfo.getSvcName();
		TrcLog.info("PubBean.log", dtaNm + ":" + svcNm);
		svcDepend.setSrcName(dtaNm);
		svcDepend.setSrcSvcName(svcNm);
		String destType = "C";
		String destName = dtaNm;
		String svcName = "examWdrPw";
		svcDepend.setDestType(destType);
		svcDepend.setDestName(destName);
		svcDepend.setSvcName(svcName);
		ConcurrentHashMap<String, SvcDepend> svcDependMap = PoolOperate.getResPoolByVersion(dtaInfo.getDepVersion())
				.getAlaHashMap().get(dtaInfo.getDtaName()).getSvcDependMap();
		String key = dtaNm + svcNm + destName + svcName;
		if (svcDependMap.get(key) == null) {
			svcDependMap.put(key, svcDepend);
		}
		EPOper.put(dtaInfo.getTpId(), "w01QryCustBasInfo_REQ[0].certTyp[0]", "00");
		EPOper.put(dtaInfo.getTpId(), "w01QryCustBasInfo_REQ[0].custNm[0]", "李佳");
		EPOper.put(dtaInfo.getTpId(), "w01QryCustBasInfo_REQ[0].certNb[0]", "110136198711235630");
		DTATool dtaTool = (DTATool) SpringUtil.getBean("dtaTool");
		dtaTool.callSubSvcLogic("qryCustBasInfo", false, false);

	}
//	/***
//	 * 调用同步授权服务
//	 */
//	public static void qSynAuthChk(){
//		SvcDepend svcDepend = new SvcDepend();
//		svcDepend.setSrcType("C");
//		DtaInfo dtaInfo = DtaInfo.getInstance();
//		String dtaNm = dtaInfo.getDtaName();
//		String svcNm = dtaInfo.getSvcName();
//		TrcLog.info("PubBean.log", dtaNm + ":" + svcNm);
//		svcDepend.setSrcName(dtaNm);
//		svcDepend.setSrcSvcName(svcNm);
//		String destType = "O";
//		String destName = "c00_w01_output";
//		String svcName = "qSynAuthChk";
//		svcDepend.setDestType(destType);
//		svcDepend.setDestName(destName);
//		svcDepend.setSvcName(svcName);
//		ConcurrentHashMap<String, SvcDepend> svcDependMap = PoolOperate.getResPoolByVersion(dtaInfo.getDepVersion())
//				.getAlaHashMap().get(dtaInfo.getDtaName()).getSvcDependMap();
//		String key = dtaNm + svcNm + destName + svcName;
//		if (svcDependMap.get(key) == null) {
//			svcDependMap.put(key, svcDepend);
//		}
//		// 从报文头中取交易密码
//		try {
//			// 赋值
//			String asscOEcd = (String) EPOper.get(dtaInfo.getCpId(), "ReqBean[0].head[0].servInitrBrch[0]");
//			EPOper.put(dtaInfo.getCpId(), "iQ_SynAuthChk_REQ[0].asscOEcd[0]", asscOEcd);
//			String operNo = (String) EPOper.get(dtaInfo.getCpId(), "ReqBean[0].head[0].usrId[0]");
//			EPOper.put(dtaInfo.getCpId(), "iQ_SynAuthChk_REQ[0].usrId[0]", operNo);
//			String chnlCd = (String) EPOper.get(dtaInfo.getCpId(), "ReqBean[0].head[0].servInitrChanl[0]");
//			EPOper.put(dtaInfo.getCpId(), "iQ_SynAuthChk_REQ[0].chnlCd[0]", chnlCd);
//			String servEcd = (String) EPOper.get(dtaInfo.getCpId(), "ReqBean[0].head[0].servEcd[0]");
//			EPOper.put(dtaInfo.getCpId(), "iQ_SynAuthChk_REQ[0].srvCd[0]", servEcd);
//			String authOper = (String) EPOper.get(dtaInfo.getCpId(), "ReqBean[0].head[0].authOper[0]");
//			EPOper.put(dtaInfo.getTpId(), "ReqBean[0].head[0].authOpPerId[0]", authOper);
//
//			
//			DTATool dtaTool = (DTATool) SpringUtil.getBean("dtaTool");
//			dtaTool.callOutPut("c00_w01_output", "qSynAuthChk");
//			String retCd = (String) EPOper.get(dtaInfo.getCpId(), "RspBean.head.rspsCd");
//			if (!retCd.equals("0000000")) {
//				throw new BaseException("PCA1006", "同步授权失败");
//			}
//
//		} catch (Exception e) {
//			e.printStackTrace();
//			throw new BaseException("PCA1106", "同步授权失败");
//		}
//
//	}
//	public static void examPwd() {
//		SvcDepend svcDepend = new SvcDepend();
//		svcDepend.setSrcType("C");
//		DtaInfo dtaInfo = DtaInfo.getInstance();
//		String dtaNm = dtaInfo.getDtaName();
//		String svcNm = dtaInfo.getSvcName();
//		TrcLog.info("PubBean.log", dtaNm + ":" + svcNm);
//		svcDepend.setSrcName(dtaNm);
//		svcDepend.setSrcSvcName(svcNm);
//		String destType = "O";
//		String destName = "c00_w01_output";
//		String svcName = "w01QrySglAInfoSrv";
//		svcDepend.setDestType(destType);
//		svcDepend.setDestName(destName);
//		svcDepend.setSvcName(svcName);
//		ConcurrentHashMap<String, SvcDepend> svcDependMap = PoolOperate.getResPoolByVersion(dtaInfo.getDepVersion())
//				.getAlaHashMap().get(dtaInfo.getDtaName()).getSvcDependMap();
//		String key = dtaNm + svcNm + destName + svcName;
//		if (svcDependMap.get(key) == null) {
//			svcDependMap.put(key, svcDepend);
//		}
//		// 从报文头中取交易密码
//		String certTypNo = (String) EPOper.get(dtaInfo.getCpId(), "ReqBean.head.certTypNo");// 第8位
//		String flg = PubExam.getCharAt(certTypNo, 8);
//		TrcLog.info("PubBean.log", "certTypNo: " + certTypNo);
//		if (!flg.equals("1")) {
//			throw new BaseException("PCA1106", "未上送取款密码");
//		}
//		String certCnct = (String) EPOper.get(dtaInfo.getCpId(), "ReqBean.head.certCntnt");
//		TrcLog.info("PubBean.log", "certCnct: " + certCnct);
//		ObjectMapper mapper = new ObjectMapper();
//		try {
//			Map<String, Object> map = mapper.readValue(certCnct, Map.class);
//			Map<String, String> map1 = (Map<String, String>) map.get("07");// 获取取款密码
//			if (map == null || map1.isEmpty()) {
//				throw new BaseException("PCA1106", "未上送取款密码");
//			}
//			String acctNo = map1.get("acctNo");
//			String pwd = map1.get("pwd");
//			//EPOper.put(dtaInfo.getTpId(), "examWdrPw_REQ[0].pwd[0]", pwd);
//			pwd = PubExamPwdBean.unionEncryptPin(pwd);
//			// 赋值
//			EPOper.put(dtaInfo.getCpId(), "BsInfBassServQrySglsAcctInfo_input[0].qryAcctno[0]", acctNo);
//			EPOper.put(dtaInfo.getCpId(), "BsInfBassServQrySglsAcctInfo_input[0].pwdTypCd[0]", "2");
//			EPOper.put(dtaInfo.getCpId(), "BsInfBassServQrySglsAcctInfo_input[0].pwdFlg[0]", "1");
//			EPOper.put(dtaInfo.getCpId(), "BsInfBassServQrySglsAcctInfo_input[0].pwd[0]", pwd);
//			EPOper.put(dtaInfo.getTpId(), "ReqBean[0].head[0].servEcd[0]", "w01QrySglAInfoSrv");
//
//			// EPOper.put(epID, elementName, obj)
//			DTATool dtaTool = (DTATool) SpringUtil.getBean("dtaTool");
//			dtaTool.callOutPut("c00_w01_output", "w01QrySglAInfoSrv");
//			// dtaTool.callSubSvcLogic("qryCustBasInfo", false, false);
//			String retCd = (String) EPOper.get(dtaInfo.getCpId(), "RspBean.head.rspsCd");
//			if (!retCd.equals("0000000")) {
//				throw new BaseException("PCA1006", "校验取款密码失败");
//			}
//
//		} catch (Exception e) {
//			e.printStackTrace();
//			throw new BaseException("PCA1106", "未上送取款密码");
//		}
//
//	}
	/* ######################一期代码############################## */

	/**
	 * 如果为-1 则返回全部
	 * 
	 * @param evPgQty
	 *            每页数量
	 * @return
	 */
	public int getEvPgQtyt(int evPgQty) {
		if (evPgQty == -1) {
			// $qryListRsltNum.recordAmt
			DtaInfo dtaInfo = DtaInfo.getInstance();
			CompSDO compSDO = EPOper.getCompSDO(dtaInfo.getTpId(), "qryListRsltNum");
			int recordAmt = (int) compSDO.getValue("recordAmt");
			evPgQty = recordAmt;
		}
		return evPgQty;
	}

	/**
	 * 吉林微信贷款使用
	 * </p>
	 * 将核心上送的内容1和URL拼接成微信需要的content
	 * 
	 * @return content
	 */
	public String getContentForWeChat() {

		// BsInfExtlCnctServMsgPush_input 获取
		DtaInfo dtaInfo = DtaInfo.getInstance();
		CompSDO compSDO = EPOper.getCompSDO(dtaInfo.getTpId(), "bsInfExtlCnctServMsgPush_input");
		String cntnt1 = (String) compSDO.getValue("cntnt1");
		String URL = (String) compSDO.getValue("URL");
		String content = "";// 微信需要的content
		if (URL == null || URL == "") {
			content = cntnt1;
		} else {
			content = "<a href='" + URL + "'>" + cntnt1 + "</a>";// 带连接的
		}
		return content;
	}

	/**
	 * 吉林微信贷款使用
	 * </p>
	 * 微信客服消息记录编号，生成规则：由九位随机数和当前精确到秒的时间戳组成
	 * 
	 * @return
	 */
	public String getRcdId() {
		String rcdID = "";
		// 产生1000-9999之间的一个随机数
		int code = (int) (Math.random() * (400000000 - 100000000)) + 100000000;
		String codestr = String.valueOf(code);
		// 当前时间的精确到秒
		Date date = new Date();
		DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
		String finlUpdTm = df.format(date);
		rcdID = codestr + finlUpdTm;
		return rcdID;
	}

	/**
	 * 吉林微信贷款使用
	 * </p>
	 * 微信客服消息记录精确到秒的时间
	 * 
	 * @return
	 */
	public String getWchtCreateTime() {
		Date date = new Date();
		DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
		String wchtCreateTime = df.format(date);

		return wchtCreateTime;
	}

	/**
	 * 吉林微信贷款使用
	 * </p>
	 * 根据微信返回的错误码，设置是否成功标,0为成功，1为失败
	 * </p>
	 * 微信端成功返回“0”
	 * 
	 * @return
	 */
	public String getStat(String errcode) {
		if ("0".equals(errcode)) {// 成功
			return errcode;
		} else {// 失败
			return "1";
		}
	}

	/**
	 * 吉林微信贷款使用
	 * </p>
	 * 微信客服消息记录查询时间添上时分秒
	 * 
	 * @return
	 */
	public String connectTime(String time) {
		DtaInfo dtaInfo = DtaInfo.getInstance();
		CompSDO compSDO = EPOper.getCompSDO(dtaInfo.getTpId(), "csInfBassServQryWchtMsgPush_input");
		String time1 = "";
		if ("000000".equals(time)) {
			time1 = (String) compSDO.getValue("begTm");// +00000
		} else {
			time1 = (String) compSDO.getValue("finTm");// +235959
		}
		return time1 + time;
	}

//	public int getInitFlag() {
//		DtaInfo dtaInfo = DtaInfo.getInstance();
//		String strInit = (String) EPOper.get(dtaInfo.getTpId(), "ReqBean[0].head[0].servInitrBrch");
//		TrcLog.log("getInit.log", "strInit=" + strInit);
//		if (strInit.equals("5200")) {
//			TrcLog.log("getInit.log", "strInit=0");
//			return 0;
//		} else if (strInit.equals("2200")) {
//			TrcLog.log("getInit.log", "strInit=1");
//			return 1;
//		}
//		TrcLog.log("getInit.log", "strInit=0");
//		return 0;
//	}
//  mod by caoyu 20181026 与一期版本同步
	public int getInitFlag(){
		DtaInfo dtaInfo = DtaInfo.getInstance();
		String strInit=(String) EPOper.get(dtaInfo.getTpId(), "ReqBean[0].head[0].servInitrBrch");
		//TrcLog.log("getInit.log", "strInit="+strInit);
		if(strInit.equals("5200")){
			//TrcLog.log("getInit.log", "strInit=0");  
			return 0;
		}else if(strInit.equals("2200")){
			//TrcLog.log("getInit.log", "strInit=1");
			return 1;
		}else if(strInit.equals("6100")){
			//TrcLog.log("getInit.log", "strInit=1");
			return 0;
		}else if(strInit.equals("1120")){
			//TrcLog.log("getInit.log", "strInit=1");
			return 1;
		}
		//TrcLog.log("getInit.log", "strInit=0");
		
		//北京中心0-对应机构：5200湖北-1120天津滨海
		//长沙中心1-对应机构：2200-6100广西
		/*String bjBrch = ResPool.configMap.get("bjBrch");
		String[] appList = bjBrch.split("|");
		for(int i = 0 ;i<appList.length;i++){
			if(appList[i].equals(strInit)){
				return 0;
			}
		}
		String csBrch = ResPool.configMap.get("csBrch");
//		if(strInit.equals("2200")){
//			return 1;
//		}
		String[] csAppList = bjBrch.split("|");
		for(int i = 0 ;i<csAppList.length;i++){
			if(appList[i].equals(strInit)){
				return 1;
			}
		}*/
		return 0;
	}
	
	/**
	 * 吉林燃气缴费，生成chnlSeqNb
	 * 
	 */
	public String getChnlSeqNb() {
		// 取序号发生器生成的值
		int seq = StarringSeq.getCustomSeq("4");// 开发环境为6，性能环境为4，其他环境需从新设置
		// 3位流水号
		String seqNo = String.format("%05d", seq);
		DtaInfo dtaInfo = DtaInfo.getInstance();
		// 取机器节点号
		String nodeName = dtaInfo.getNodeName();
		int nodeNo = Integer.parseInt(nodeName);
		// 3位节点名
		String seqName = String.format("%03d", nodeNo);
		// 获取chnlSeqNb
		String chnlSeqNb = seqName + getNowDate() + seqNo;

		return chnlSeqNb;
	}

	/**
	 * 
	 */
	public String getApyNo() {
		/* 取序号发生器生成的值 */
		int seq = StarringSeq.getCustomSeq("5");
		String seqNo = String.format("%05d", seq);// 3位流水号
		DtaInfo dtaInfo = DtaInfo.getInstance();
		Object servInitrBrch = EPOper.get(dtaInfo.getTpId(), "ReqBean[0].head[0].servInitrBrch");
		String instEcd = "";
		try {
			instEcd = servInitrBrch.toString();
		} catch (Exception e) {
			instEcd = "0000";
		}
		String nodeName = dtaInfo.getNodeName(); // 取机器节点号
		int nodeNo = Integer.parseInt(nodeName); // 转化为整型的节点号
		String seqName = String.format("%03d", nodeNo);// 3位节点名
		Date date = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");
		String str = sdf.format(date);
		String loanId = new StringBuffer(instEcd).append(seqName).append(str).append(seqNo).toString();
		return loanId;
	}

	/**
	 * 对时间去‘-’处理，10位转8位
	 */
	public String getTm8() {
		String brthDt = "";
		StringBuffer sb = new StringBuffer("");
		try {
			brthDt = (String) EPOper.get(DtaInfo.getInstance().getTpId(), "bsInfBSLoanApyLocal_input[0].brthDt");
			String[] str = brthDt.split("-");

			for (int i = 0; i < str.length; i++) {
				sb.append(str[i]);
			}
		} catch (Exception e) {
			// TODO: handle exception
		}
		return sb.toString();
	}

	/**
	 * 获取6位时分秒时间
	 * 
	 * 
	 */
	public static String getTm() {
		Date date = new Date();
		DateFormat df = new SimpleDateFormat("HHmmss");
		String dbTm = df.format(date);
		return dbTm;
	}

	/**
	 * 
	 * 将8位长日期转换成10位长日期
	 * 
	 */
	public static String dt8ToDt10(String dt8) {
		DtaInfo dtaInfo = DtaInfo.getInstance();
		String date8 = (String) EPOper.get(dtaInfo.getTpId(), dt8);

		String date10 = date8.substring(0, 4) + "-" + date8.substring(4, 6) + "-" + date8.substring(6, 8);

		return date10;
	}
	
	/**
     * 根据合作机构编码查询网联银联标志
     * @param asscOEcd 合作机构编码
	 * @param element 
     * @return
     */
    public static String qryPymtChnlMed(String asscOEcd, String pymtChnlCd, String chnlFeCd, String element){
    	String tpId = DtaInfo.getInstance().getTpId();
    	// 获取数据源
		IDataSourceRoute dsRoute = (IDataSourceRoute) SpringUtil.getBean("dsRoute");
		//IBaseDos baseDos = dsRoute.getBaseDos("dbField_s13");//开发环境写死数据域dbField_s13
		IBaseDos baseDos = dsRoute.getBaseDos("");
    	String[] chnlFeSplit = chnlFeCd.split("\\|");//竖线分割 "0"位为支付宝渠道费用
    	String procTyp = "";
    	if ("7".equals(pymtChnlCd)){
    		procTyp = chnlFeSplit[0];
        }else if ("8".equals(pymtChnlCd)){
        	procTyp = chnlFeSplit[1];
		}
    	String appIdByAssc = RedisParm.getAppIdByAssc(tpId, baseDos,CpfsFeAllConfig.jedisCluster, asscOEcd, element, procTyp);
    	TrcLog.log("redis.log", "appIdByAssc="+appIdByAssc);
    	if (StringTool.isNullOrEmpty(appIdByAssc)){
        	throw new BaseException("","获取机构信息异常");
        }
        String[] split = appIdByAssc.split("\\|");
        String chnlMed = "";
        if ("7".equals(pymtChnlCd)){
        	chnlMed = split[7];
        }else if ("8".equals(pymtChnlCd)){
        	chnlMed = split[4];
		}
        if (StringTool.isNullOrEmpty(chnlMed)){
			throw new BaseException("","获取支付渠道介质异常");
		}
		return chnlMed;
    }

    /**
     * @return
     */
    public static String getNxtMsgId() {
        String dt = CpfsFeAllConfig.jedisCluster.get("NXT_NCSDATE");
        if(StringTool.isNullOrEmpty(dt)) {
            Date d = new Date();
            dt = new SimpleDateFormat("yyyyMMdd").format(d);
            TrcLog.error("nfpp.log", "redis data have not key NXT_NCSDATE");
        }
        return String.format("%8s00%08d", dt, RedisOper.getSeq("NXT_MSG_ID", 99999999));
    }
    
    /**
     * 校验字段
     * @param field 字段值
     * @param regex 正则表达式
     * @return
     */
    public static boolean matchField(String field, String regex) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(field);
        if(!matcher.matches()) 
            throw new BaseException("PCA1006", "字段值[" + field + "]类型校验不通过");
        return true;
    }
    
    /**
     * 校验字段
     * @param field 字段值
     * @param regex 正则表达式
     * @param nullError 空值是否报错
     * @return
     */
    public static boolean matchField(String field, String regex, boolean nullError) {
        if (StringTool.isNullOrEmpty(field))
            if(nullError)
                throw new BaseException("PCA1006", "字段非空校验不通过");
            else
                return true;
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(field);
        if(!matcher.matches()) 
            throw new BaseException("PCA1006", "字段值[" + field + "]类型校验不通过");
        return true;
    }

    /**
     * 检查字段值是否匹配
     * @param field 字段值
     * @param regex 匹配字符串
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchField(String field, String regex, String errCode,
            Object... errDescArgs) {
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(field);
        if(!matcher.find()) {
            throw new BaseException(errCode, errDescArgs);
        }
    }

    /**
     * 检查字段值是否匹配
     * @param field 字段值
     * @param regex 匹配字符串
     * @param nullError true-空值报错，false-空值不报错
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchField(String field, String regex, boolean nullError, String errCode,
            Object... errDescArgs) {
        if(StringTool.isNullOrEmpty(field))
            if(nullError)
                throw new BaseException(errCode, errDescArgs);
            else 
                return;
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(field);
        if(!matcher.matches()) {
            throw new BaseException(errCode, errDescArgs);
        }
    }
    
    /**
     * 检查字段值是否是数字格式(前面不补0, 正整数)
     * @param field 字段值
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchNumber(String field, String errCode, Object... errDescArgs) {
        String numberRegex = "^0$|^[1-9]\\d*$";
        matchField(field, numberRegex, errCode, errDescArgs);
    }
    
    /**
     * 检查字段值是否是数字格式(可补0，正整数)
     * @param field 字段值
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchNumber0(String field, String errCode, Object... errDescArgs) {
        String numberRegex = "^\\d+$";
        matchField(field, numberRegex, errCode, errDescArgs);
    }
    
    /**
     * 检查字段值是否是数字格式(整数，正负都可，可补0)
     * @param field 字段值
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchNumber1(String field, String errCode, Object... errDescArgs) {
        String numberRegex = "^(\\+|-)?\\d+$";
        matchField(field, numberRegex, errCode, errDescArgs);
    }
    
    /**
     * 校验字段
     * @param field 字段值
     * @return
     */
    public static boolean matchUInt(String field) {
        String doubleRegex = "^\\d+$";
        return matchField(field, doubleRegex);
    }
    
    /**
     * 校验字段
     * @param field 字段值
     * @return
     */
    public static boolean matchUInt(String field, boolean nullError) {
        if (StringTool.isNullOrEmpty(field))
            if(nullError)
                throw new BaseException("PCA1006", "无符号整型字段非空校验不通过");
            else
                return true;
        return matchUInt(field);
    }
    
    /**
     * 校验字段
     * @param field 字段值
     * @return
     */
    public static boolean matchInt(String field) {
        String doubleRegex = "^(\\+|-)?\\d+$";
        return matchField(field, doubleRegex);
    }
    
    /**
     * 校验字段
     * @param field 字段值
     * @return
     */
    public static boolean matchInt(String field, boolean nullError) {
        if (StringTool.isNullOrEmpty(field))
            if(nullError)
                throw new BaseException("PCA1006", "整型字段非空校验不通过");
            else
                return true;
        return matchInt(field);
    }
    
    /**
     * 校验字段
     * @param field 字段值
     * @return
     */
    public static boolean matchDouble(String field) {
        String doubleRegex = "^(\\+|-)?((0|[1-9]\\d*)(\\.\\d*)?|(0|[1-9]\\d*)?(\\.\\d*))(E(\\+|-)?(0|[1-9]\\d*))?$";
        return matchField(field, doubleRegex);
    }
    
    /**
     * 校验字段
     * @param field 字段值
     * @param nullError 空值是否报错
     * @return
     */
    public static boolean matchDouble(String field, boolean nullError) {
        if (StringTool.isNullOrEmpty(field))
            if(nullError)
                throw new BaseException("PCA1006", "双精度数字字段非空校验不通过");
            else
                return true;
        return matchDouble(field);
    }
    
    /**
     * 检查字段值是否是浮点型字符串
     * @param field 字段值
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchDouble(String field, String errCode, Object... errDescArgs) {
        matchDouble(field, true, errCode, errDescArgs);
    }
    
    /**
     * 检查字段值是否是浮点型字符串
     * @param field 字段值
     * @param nullError true-空值报错，false-空值不报错
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchDouble(String field, boolean nullError, String errCode, Object... errDescArgs) {
        if(StringTool.isNullOrEmpty(field))
            if(nullError)
                throw new BaseException(errCode, errDescArgs);
            else 
                return;
        String doubleRegex = "^(\\+|-)?((0|[1-9]\\d*)(\\.\\d*)?|(0|[1-9]\\d*)?(\\.\\d*))(E(\\+|-)?(0|[1-9]\\d*))?$";
        matchField(field, doubleRegex, errCode, errDescArgs);
    }
    
    /**
     * 校验字段
     * @param field 字段值
     * @param len1 整数长度
     * @param len2 小数长度
     * @return
     */
    public static boolean matchDouble(String field, int len1, int len2) {
        String doubleRegex = "^((0|[1-9]\\d{0," + (len1 - 1) + "})(\\.\\d{0," + len2 + "})?|(0|[1-9]\\d{0," + (len1 - 1) + "})?(\\.\\d{0," + len2 + "}))$";
        return matchField(field, doubleRegex);
    }
    
    /**
     * 校验字段
     * @param field 字段值
     * @param len1 整数长度
     * @param len2 小数长度
     * @param nullError 空值是否报错
     * @return
     */
    public static boolean matchDouble(String field, int len1, int len2, boolean nullError) {
        if (StringTool.isNullOrEmpty(field))
            if(nullError)
                throw new BaseException("PCA1006", "双精度数字字段非空校验不通过");
            else
                return true;
        return matchDouble(field, len1, len2);
    }
    
    /**
     * 检查字段值是否是浮点型字符串
     * @param field 字段值
     * @param len1 整数部分长度
     * @param len2 小数部分长度
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchDouble(String field, int len1, int len2, String errCode, Object... errDescArgs) {
        matchDouble(field, len1, len2, true, errCode, errDescArgs);
    }
    
    /**
     * 检查字段值是否是浮点型字符串
     * @param field 字段值
     * @param len1 整数部分长度
     * @param len2 小数部分长度
     * @param nullError true-空值报错，false-空值不报错
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchDouble(String field, int len1, int len2, boolean nullError, String errCode, Object... errDescArgs) {
        if(StringTool.isNullOrEmpty(field))
            if(nullError)
                throw new BaseException(errCode, errDescArgs);
            else 
                return;
        String doubleRegex = "^((0|[1-9]\\d{0," + (len1 - 1) + "})(\\.\\d{0," + len2 + "})?|(0|[1-9]\\d{0," + (len1 - 1) + "})?(\\.\\d{0," + len2 + "}))$";
        matchField(field, doubleRegex, errCode, errDescArgs);
    }
    
    /**
     * 检查字段值是否是日期格式 yyyy-MM-dd
     * @param field 字段值
     */
    public static boolean matchDate(String field) {
        String dateRegex = "^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2]\\d|3[0-1])$";
        return matchField(field, dateRegex);
    }
    
    /**
     * 检查字段值是否是日期格式 yyyy-MM-dd
     * @param field 字段值
     */
    public static boolean matchDate(String field, boolean nullError) {
        if (StringTool.isNullOrEmpty(field))
            if(nullError)
                throw new BaseException("PCA1006", "日期字段非空校验不通过");
            else
                return true;
        return matchDate(field);
    }
    
    /**
     * 检查字段值是否是日期格式 yyyy-MM-dd
     * @param field 字段值
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchDate(String field, String errCode, Object... errDescArgs) {
        String dateRegex = "^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2]\\d|3[0-1])$";
        matchField(field, dateRegex, errCode, errDescArgs);
    }
    
    /**
     * 检查字段值是否是日期格式 yyyy-MM-dd
     * @param field 字段值
     * @param nullError 空值是否报错
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchDate(String field, boolean nullError, String errCode, Object... errDescArgs) {
        if(StringTool.isNullOrEmpty(field))
            if(nullError)
                throw new BaseException(errCode, errDescArgs);
            else 
                return;
        matchDate(field, errCode, errDescArgs);
    }
    
    /**
     * 检查字段值是否是时间格式 HH:mm:ss
     * @param field 字段值
     */
    public static boolean matchTime(String field) {
        String timeRegex = "^([0-9]|[0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
        return matchField(field, timeRegex);
    }
    
    /**
     * 检查字段值是否是时间格式 HH:mm:ss
     * @param field 字段值
     * @param nullError 空值是否报错
     */
    public static boolean matchTime(String field, boolean nullError) {
        if (StringTool.isNullOrEmpty(field))
            if(nullError)
                throw new BaseException("PCA1006", "时间字段非空校验不通过");
            else
                return true;
        return matchTime(field);
    }

    /**
     * 检查字段值是否是日期格式 HH:mm:ss
     * @param field 字段值
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchTime(String field, String errCode, Object... errDescArgs) {
        matchTime(field, true, errCode, errDescArgs);
    }

    /**
     * 检查字段值是否是日期格式 HH:mm:ss
     * @param field 字段值
     * @param nullError 空值是否报错 
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchTime(String field, boolean nullError, String errCode, Object... errDescArgs) {
        if (StringTool.isNullOrEmpty(field)) {
            if(nullError) 
                throw new BaseException(errCode, errDescArgs);
            else 
                return;
        }
        String timeRegex = "^([0-9]|[0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
        matchField(field, timeRegex, errCode, errDescArgs);
    }
    
    /**
     * 检查字段值是否是时间格式 yyyy-MM-dd HH:mm:ss
     * @param field 字段值
     */
    public static boolean matchDateTime(String field) {
        String dateRegex = "^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2]\\d|3[0-1]) ([0-9]|[0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
        return matchField(field, dateRegex);
    }
    
    /**
     * 检查字段值是否是时间格式  yyyy-MM-dd HH:mm:ss
     * @param field 字段值
     * @param nullError 空值是否报错
     */
    public static boolean matchDateTime(String field, boolean nullError) {
        if (StringTool.isNullOrEmpty(field))
            if(nullError)
                throw new BaseException("PCA1006", "时间字段非空校验不通过");
            else
                return true;
        return matchDateTime(field);
    }

    /**
     * 检查字段值是否是时间格式 yyyy-MM-dd HH:mm:ss
     * @param field 字段值
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchDatetime(String field, String errCode, Object... errDescArgs) {
        String dateRegex = "^[1-9]\\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[1-2]\\d|3[0-1]) ([0-9]|[0-1][0-9]|2[0-3]):([0-5][0-9]):([0-5][0-9])$";
        matchField(field, dateRegex, errCode, errDescArgs);
    }

    /**
     * 检查字段值是否是时间格式 yyyy-MM-dd HH:mm:ss
     * @param field 字段值
     * @param nullError 空值是否报错 
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchDatetime(String field, boolean nullError, String errCode, Object... errDescArgs) {
        if (StringTool.isNullOrEmpty(field)) {
            if(nullError) 
                throw new BaseException(errCode, errDescArgs);
            else 
                return;
        }
        matchDatetime(field, true, errCode, errDescArgs);
    }

    /**
     * 检查字段值是否符合汉字、字母、数字随意组合格式, 2-128位
     * @param field 字段值
     */
    public static boolean matchName(String field) {
        String nameRegex = "^[\u4e00-\u9fa5\\w-]{2,128}$";
        return matchField(field, nameRegex);
    }

    /**
     * 检查字段值是否符合汉字、字母、数字随意组合格式, 2-128位
     * @param field 字段值
     * @param nullError 空值是否报错
     */
    public static boolean matchName(String field, boolean nullError) {
        if (StringTool.isNullOrEmpty(field))
            if(nullError)
                throw new BaseException("PCA1006", "名称字段非空校验不通过");
            else
                return true;
        return matchName(field);
    }

    /**
     * 检查字段值是否符合汉字、字母、数字随意组合格式, 2-128位
     * @param field 字段值
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchName(String field, String errCode, Object... errDescArgs) {
        matchName(field, true, errCode, errDescArgs);
    }


    /**
     * 检查字段值是否符合汉字、字母、数字随意组合格式, 2-128位
     * @param field 字段值
     * @param nullError 空值是否报错 
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchName(String field, boolean nullError, String errCode, Object... errDescArgs) {
        if (StringTool.isNullOrEmpty(field)) {
            if(nullError) 
                throw new BaseException(errCode, errDescArgs);
            else 
                return;
        }
        String nameRegex = "^[\u4e00-\u9fa5\\w-]{2,128}$";
        matchField(field, nameRegex, errCode, errDescArgs);
    }

    /**
     * 检查字段值是否符合汉字、字母、数字随意组合格式
     * @param field 字段值
     */
    public static boolean matchName(String field, int minlen, int maxlen) {
        if(minlen > maxlen) {
            maxlen = minlen + maxlen;
            minlen = maxlen - minlen;
            maxlen = maxlen - minlen;
        }
        String nameRegex = "^[\u4e00-\u9fa5\\w-]{" + minlen + "," + maxlen + "}$";
        return matchField(field, nameRegex);
    }

    /**
     * 检查字段值是否符合汉字、字母、数字随意组合格式
     * @param field 字段值
     * @param nullError 空值是否报错
     */
    public static boolean matchName(String field, int minlen, int maxlen, boolean nullError) {
        if (StringTool.isNullOrEmpty(field))
            if(nullError)
                throw new BaseException("PCA1006", "名称字段非空校验不通过");
            else
                return true;
        return matchName(field, minlen, maxlen);
    }

    /**
     * 检查字段值是否符合汉字、字母、数字随意组合格式
     * @param field 字段值
     * @param minlen 最小长度
     * @param maxlen 最大长度
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchName(String field, int minlen, int maxlen, String errCode, Object... errDescArgs) {
        matchName(field, minlen, maxlen, true, errCode, errDescArgs);
    }
    
    /**
     * 检查字段值是否符合汉字、字母、数字随意组合格式
     * @param field 字段值
     * @param minlen 最小长度
     * @param maxlen 最大长度
     * @param nullError 空值是否报错 
     * @param errCode 不匹配时返回的错误码
     * @param errDescArgs 错误描述的参数
     */
    public static void matchName(String field, int minlen, int maxlen, boolean nullError, String errCode, Object... errDescArgs) {
        if (StringTool.isNullOrEmpty(field)) {
            if(nullError) 
                throw new BaseException(errCode, errDescArgs);
            else 
                return;
        }
        if(minlen > maxlen) {
            maxlen = minlen + maxlen;
            minlen = maxlen - minlen;
            maxlen = maxlen - minlen;
        }
        String nameRegex = "^[\u4e00-\u9fa5\\w-]{" + minlen + "," + maxlen + "}$";
        matchField(field, nameRegex, errCode, errDescArgs);
    }
    
    /**
     * 校验枚举字段
     * @param field 字段
     */
    public static boolean matchEnum(String field, String... enumNames) {
        if(!Arrays.asList(enumNames).contains(field)) {
            throw new BaseException("PCA1006", "字段值[" + field + "]枚举校验不通过");
        }
        return true;
    }
    
    /**
     * 校验枚举字段
     * @param field 字段
     * @param nullError 空值是否报错
     */
    public static boolean matchEnum(String field, boolean nullError, String... enumNames) {
        if(!Arrays.asList(enumNames).contains(field)) {
            if(StringTool.isNullOrEmpty(field)) {
                if(nullError)
                    throw new BaseException("PCA1006", "枚举字段非空校验不通过");
                else
                    return true;
            }
            throw new BaseException("PCA1006", "字段值[" + field + "]枚举校验不通过");
        }
        return true;
    }
    
    /**
     * 校验枚举字段
     * @param field 字段
     * @param nullError true-空值报错，false-允许为空
     * @param errCode 报错时的错误码
     * @param errDescArgs 报错时的错误描述
     */
    public static void matchEnum(String field, String[] enumNames, boolean nullError, String errCode, Object... errDescArgs) {
        if(!Arrays.asList(enumNames).contains(field)) {
            if(StringTool.isNullOrEmpty(field) && !nullError) {
                return;
            }
            throw new BaseException(errCode, errDescArgs);
        }
    }

    /**
     * 校验枚举字段
     * @param field 字段
     * @param emumNames 枚举值
     * @param errCode 报错时的错误码
     * @param errDescArgs 报错时的错误描述
     */
    public static void matchEnum(String field, String[] enumNames, String errCode, Object... errDescArgs) {
        matchEnum(field, enumNames, false, errCode, errDescArgs);
    }
    

/**正则表达式**/
    private static String reg = "(?:')|(?:--)|(/\\*(?:.|[\\n\\r])*?\\*/)|"
                                + "(\\b(select|update|union|and|or|delete|insert|trancate|char|into|substr|ascii|declare|exec|count|master|into|drop|execute)\\b)";
 
//   \\b  表示 限定单词边界  比如  select 不通过   1select则是可以的
    private static Pattern sqlPattern = Pattern.compile(reg, Pattern.CASE_INSENSITIVE);
 
    private static boolean isSqlPatValid(String str)
    {
    	if(str == null)
    		return true;
        if (sqlPattern.matcher(str).find())
        {
         
        	TrcLog.info("pattern.log", "%s 防sql注入检查不通过[FALSE]", str);
            return false;
        }
        TrcLog.info("pattern.log", "%s 防sql注入检查通过[TRUE]", str);
        return true;
    } 
    public static boolean isSqlPlatValid(String[] attrs){
    	TrcLog.info("pattern.log", "%s", Arrays.asList(attrs));
    	for(String attr:attrs){
    		boolean flag = isSqlPatValid(attr);
    		if(flag == false){
    			return false;
    		}
    	}
    	return true;
    }
    
    /**
     * 按正则表达式判断返回结果，若表达式或检查目标字符串为空，则默认返回false
     * @param rexp
     * @param value
     * @return
     */
    private static boolean isMatch(String rexp, String value){
		if (StringTool.isNullOrEmpty(rexp) || StringTool.isNullOrEmpty(value)) {
			return false;
		}
		Pattern pattern = Pattern.compile(rexp);
		Matcher isNum = pattern.matcher(value);
		return isNum.matches();
	}
	
    /**
     * 判断日期字符串是否符合日期规范（yyyy-MM-dd格式及对应值是否合法[包含闰年判断、日期及月份数值合法判断等]）
     * @param date
     * @return
     */
	public static boolean isValidDate(String date) {
    	String rexpFmt = "\\d{4}[-.]\\d{1,2}[-.]\\d{1,2}(\\s\\d{2}:\\d{2}(:\\d{2})?)?";    	
    	String rexpVal = "^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))";
    	if (isMatch(rexpFmt, date)) {
			return isMatch(rexpVal, date);
		} else {
			return isMatch(rexpFmt, rexpFmt);
		}
    }
   
	//
	public void changeServInitrBrch() {
		DtaInfo dtaInfo = DtaInfo.getInstance();
		String servInitrBrch = ((String) EPOper.get(dtaInfo.getTpId(), "ReqBean[0].head[0].servInitrBrch")).substring(0,2)+"00";
		EPOper.put(DtaInfo.getInstance().getTpId(), "csInfBassSerQryCity_input[0].superior", servInitrBrch);
	}
	/**
	 * 调用微信的同步授权
	 * */
	public static void wxSynAuth() {
		DtaInfo dtaInfo = DtaInfo.getInstance();
		// 获取交易数据池ID
		String tpId = dtaInfo.getTpId();
		String cpId = dtaInfo.getCpId();
		//从报文头取得可能用到的数据
		String servCd = (String) EPOper.get(tpId, "ReqBean[0].head[0].servEcd[0]");					//服务编码			服务编码
		String applnBrchEncd = (String) EPOper.get(tpId, "ReqBean[0].head[0].servInitrBrch[0]");	//应用机构编码		发起服务机构
		//String chanlCd = (String) EPOper.get(tpId, "ReqBean[0].head[0].servInitrChanl[0]");			//渠道编码		渠道编号
		
//		String temp = (String) EPOper.get(tpId, "ReqBean[0].head[0].certCntnt[0]");					//认证内容
//		JSONObject jsonObject = JSONObject.fromObject(temp);
//		String pwdTemp = jsonObject.getString((String) EPOper.get(tpId, "ReqBean[0].head[0].certTypNo[0]"));
//		pwdTemp = pwdTemp.substring(1,pwdTemp.length()-1);
//		JSONObject json = JSONObject.fromObject(pwdTemp);
//		String pwd = json.getString("certCntnt");
		String temp = (String) EPOper.get(tpId, "ReqBean[0].head[0].certCntnt[0]");					//认证内容
		Map parseObject = JSON.parseObject(temp,Map.class);
        String tmp = parseObject.get("08").toString();
        Map parseObject1 = JSON.parseObject(tmp,Map.class);
        String authPwd = parseObject1.get("certCntnt").toString();
																			//授权员密码		认证内容
		String operId = (String) EPOper.get(tpId, "ReqBean[0].head[0].usrId[0]");					//操作员id			用户ID
		String authId = (String) EPOper.get(tpId, "ReqBean[0].head[0].authOper[0]");				//授权员id			授权操作员

		//为微信同步授权输入数据对象赋值
		CompSDO reqSDO = (CompSDO) EPOper.getCompSDO(cpId, "csInfBassServAsyAuth_input");
		reqSDO.setValue("servCd", servCd);
		reqSDO.setValue("applnBrchEncd", applnBrchEncd);
		reqSDO.setValue("chanlCd", "inmgmt");
		reqSDO.setValue("authPwd", authPwd);
		reqSDO.setValue("operId", operId);
		reqSDO.setValue("authId", authId);

		//调用微信同步授权服务
		EPOper.put(tpId, "ReqBean[0].head[0].servEcd", "wx_csInfBassServSynAuth");
		DTATool dtaTool = (DTATool) SpringUtil.getBean("dtaTool");
		dtaTool.callOutPut("c00_s09_output", "wx_csInfBassServSynAuth");
		String retCd = (String) EPOper.get(dtaInfo.getCpId(), "RspBean.head.rspsCd");
		if (!retCd.equals("0000000")) {
			throw new BaseException("PCA1006", "同步授权失败");
		}
//		dtaTool.callSubSvcLogic("wx_csInfBassServSynAuth", false, false);
    }
	
	/**
     * 建立服务依赖
     * @param destName 接出点
     * @param svcName 要调用的接出点服务 
     */
    public static void buildSrvDepend(DtaInfo dtaInfo,String destName,String svcName) {
        SvcDepend svcDepend = new SvcDepend();
        svcDepend.setSrcType("C");
        String dtaNm = dtaInfo.getDtaName();
        String svcNm = dtaInfo.getSvcName();
        TrcLog.info("SvcDepend.log", dtaNm + ":" + svcNm);
        svcDepend.setSrcName(dtaNm);
        svcDepend.setSrcSvcName(svcNm);
        String destType = "O";
        //String destName = "c00_w01_output";
        //String svcName = "qSynAuthChk";
        svcDepend.setDestType(destType);
        svcDepend.setDestName(destName);
        svcDepend.setSvcName(svcName);
        ConcurrentHashMap<String, SvcDepend> svcDependMap = PoolOperate.getResPoolByVersion(dtaInfo.getDepVersion())
                .getAlaHashMap().get(dtaInfo.getDtaName()).getSvcDependMap();
        String key = dtaNm + svcNm + destName + svcName;
        if (svcDependMap.get(key) == null) {
            svcDependMap.put(key, svcDepend);
        }
    }
    
    
    /**
     * 查询汇路及分支行信息
     * @param asscOEcd 合作机构编码
     * @param chnlCd 渠道
     * @param tAmt 交易金额
     * @param xfePat 转账模式
     * @param pymtA 付款账号
     * @param clctA 收款账号 
     * @param clrgbndBnknbr 清算行行号
     * @param dataMapFlg 源中心体系是否建立与接出点的头部数据映射，1-建立，0-未建立，默认0
     * @return Map 返回一个Map，key："rspCd"返回码，"respsInfoDesc"返回描述，"rmChnl"汇款渠道，"shrBrchFlg"是否有分支行
     */
    public static Map<String,String> qryRmChnl(String asscOEcd,String chnlCd,double tAmt,String xfePat,String pymtA,String clctA,String clrgbndBnknbr,String dataMapFlg) {
        DtaInfo dtaInfo = DtaInfo.getInstance();
        //建立服务依赖
        TrcLog.log("qryRmChnl.log", "建立依赖");
        buildSrvDepend(dtaInfo,"c00_w01_output","iQ_RmChnlInfo");
        //调用
        if(StringTool.isNullOrEmpty(dataMapFlg) || dataMapFlg.equals("0")) {
            EPOper.put(dtaInfo.getCpId(), "ReqBean[0].head[0].servInitrBrch[0]", asscOEcd); 
            EPOper.put(dtaInfo.getCpId(), "ReqBean[0].head[0].servInitrChanl[0]", chnlCd);
            EPOper.put(dtaInfo.getCpId(), "ReqBean[0].head[0].servEcd[0]", "iQ_RmChnlInfo"); 
            EPOper.put(dtaInfo.getCpId(), "ReqBean[0].head[0].initrSeqno[0]", (String) EPOper.get(dtaInfo.getTpId(), "ReqBean[0].head[0].initrSeqno[0]"));
        }else{
            EPOper.put(dtaInfo.getTpId(), "ReqBean[0].head[0].servEcd[0]", "iQ_RmChnlInfo");
            //EPOper.put(dtaInfo.getTpId(), "ReqBean[0].head[0].initrSeqno[0]", (String) EPOper.get(dtaInfo.getTpId(), "ReqBean[0].head[0].initrSeqno[0]"));
        }
        EPOper.put(dtaInfo.getCpId(), "iQ_RmChnlInfo_REQ[0].tAmt[0]", tAmt);
        EPOper.put(dtaInfo.getCpId(), "iQ_RmChnlInfo_REQ[0].xfePat[0]", xfePat);
        EPOper.put(dtaInfo.getCpId(), "iQ_RmChnlInfo_REQ[0].pymtA[0]", pymtA);
        EPOper.put(dtaInfo.getCpId(), "iQ_RmChnlInfo_REQ[0].clctA[0]", clctA);
        EPOper.put(dtaInfo.getCpId(), "iQ_RmChnlInfo_REQ[0].clrgbndBnknbr[0]", clrgbndBnknbr);
        TrcLog.log("qryRmChnl.log", "tAmt:%s,xfePat:%s,pymtA:%s,clctA:%s,clrgbndBnknbr:%s",
            String.valueOf(tAmt),xfePat,pymtA,clctA,clrgbndBnknbr);
        
        TrcLog.log("qryRmChnl.log", "接出");
        DTATool dtaTool = (DTATool) SpringUtil.getBean("dtaTool");
        dtaTool.callOutPut("c00_w01_output", "iQ_RmChnlInfo");
        TrcLog.log("qryRmChnl.log", "取返回信息");
        
        String rspCd = (String) EPOper.get(dtaInfo.getCpId(), "RspBean[0].head[0].rspsCd");
        String respsInfoDesc = (String) EPOper.get(dtaInfo.getCpId(), "RspBean[0].head[0].respsInfoDesc");
        Map<String,String> map = new HashMap<>();
        if(!rspCd.equals("0000000")) {
            map.put("rspCd", rspCd);
            map.put("respsInfoDesc", respsInfoDesc);
        }else {
            map.put("rspCd", rspCd);
            map.put("respsInfoDesc", respsInfoDesc);
            map.put("rmChnl", (String) EPOper.get(dtaInfo.getCpId(), "iQ_RmChnlInfo_RSP[0].rmChnl"));
            map.put("shrBrchFlg", (String) EPOper.get(dtaInfo.getCpId(), "iQ_RmChnlInfo_RSP[0].shrBrchFlg"));
        }
        
        TrcLog.log("qryRmChnl.log", "map:"+map.toString());
        return map;
        
    }
	
	
    /**
     * 校验位图是否为取款密码
     * 
     * @return true-校验取款密码；false-不校验取款密码
     */
    public boolean examPwd() {
        boolean flag = false;
        String tpId = DtaInfo.getInstance().getTpId();
        String certTypNo = (String) EPOper.get(tpId, "ReqBean[0].head[0].certTypNo");
        if(StringTool.isNullOrEmpty(certTypNo)) {
            throw new BaseException("PCA1006", "认证位图为空");
        }
        
        //要进行取款密码校验
        if(certTypNo.length()>7 && certTypNo.charAt(7) == '1') { 
            flag = true;
        }
        
        return flag;
        
    }
    
    /**
     * 获取与当日相差n天的时间/日期
     * @param num
     * @param outFmt
     * @return
     */
	public static String getSomeDay(int num, String outFmt) {
		SimpleDateFormat sdf = new SimpleDateFormat(outFmt);
		Calendar calendar = Calendar.getInstance();
		calendar.setTime(new Date());
		calendar.add(Calendar.DATE, num);
		Date date = calendar.getTime();
		return sdf.format(date);
	}
    
	
	/**
	 * 根据报文路径获取值列表
	 */
	@SuppressWarnings("rawtypes")
	public static List<Map> getXmlPathValues(byte[] msg, List<String> paths) throws ParserConfigurationException, SAXException, IOException, XPathExpressionException{
		
		XPathFactory xpfactory = XPathFactory.newInstance();
	    XPath xPath = xpfactory.newXPath();
	    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		DocumentBuilder documentBuilder = factory.newDocumentBuilder();
	    Document doc = documentBuilder.parse(new ByteArrayInputStream(msg)); 
		List<Map> values = new ArrayList<>();
		Map<String, Object> map = new HashMap<String, Object>();
		Map<String, Object> mapUstrd = new HashMap<String, Object>();
		String value = "";
		String[]  list = null;
		for(String path: paths){
			value = xPath.evaluate(path, doc).trim();
			if(StringUtils.isEmpty(value)){
				value = "";
				map.put(path, value);
			}else{
				if(path.contains("Ustrd")&&value.contains("/")){
					list = value.split("/");
					if(list.length > 2 && list[2] != null){
						mapUstrd.put(list[1], list[2]);	
					}else{
						mapUstrd.put(list[1], "");	
					}
					if(path.contains("[")){
						path = path.substring(0,path.lastIndexOf("["));
					}
					map.put(path, mapUstrd);
				}else{
					map.put(path, value);
				}
			}
		}
		values.add(map);
		return values;
	}


	public static void main(String[] args) {
		// PubBean pubBean = new PubBean();
		// System.out.println(pubBean.routeDB("", 2));
		// System.out.println(putC03Srv());
		String aa = "<sds><Ustrd>/Remark/农信银增值服务系统20190417结算款</Ustrd><Ustrd>/TranChnlTyp/07</Ustrd><Ustrd>/SttlmDt/2020-01-20</Ustrd><Ustrd>/Purpose/1</Ustrd><Ustrd>/TransFee/0.00</Ustrd></sds>";
		byte [] bizMsg_byte =aa.getBytes();
		String path = "//Ustrd[1],//Ustrd[2],//Ustrd[3],//Ustrd[4]";

	    List<String> paths = Arrays.asList(path.split(","));
		try {
			 List<Map> ss =PubBean.getXmlPathValues(bizMsg_byte, paths);
			 System.out.println(ss.toString());
		} catch (XPathExpressionException | ParserConfigurationException | SAXException | IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
		
	}
    
    
}
